Aus einer .exe eine .exe erzeugen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Rikudo.

    Aus einer .exe eine .exe erzeugen

    Hallo Liebe VB-Gemeinde,

    Meine Frage:
    Lässt sich aus einer exe eine exe erzeugen? Wie ich mir das vorstelle? So:

    Ich habe eine Form mit verschiedenen Buttons Checkboxen usw.
    Unten ist ein Button Create exe.
    Jetzt soll mir aus meiner Form heraus eine exe erzeugt werden, die nur die Codes enthält bei denen die Ceckboxen einen Hacken hatten.

    Als Beispiel:
    Ich habe bei meiner Form eine Checkbox, "Red Background" im Loadereignis. Wenn da die Checkbox einen Hacken hat und ich auf "Build exe" klicke soll mir eine neue exe
    erstellt und auf dem Desktop gespeichert werden. Diese muss jetzt beim Load Ereignis einen Roten Hintergrund haben. Ich hoffe ich habe es verstädnlich erklärt :)

    Ich weiß nicht wie ich anfangen soll, daher frage ich hier um Hilfe^^

    Lg
    Rikudo
    C# Developer
    Learning C++
    Hi
    am einfachsten geht das über einen z.B. VBCodeProvider, bei dem du einfach nur bestimmte Codesegmente kompilierst (z.B. über Präprozessordirektiven, die du setzt. Dazu einfach den Quellcode in die Resourcen packen und einfach

    VB.NET-Quellcode

    1. "#Const XACTIVE = " + If(_checkBoxX.Value, "True", "False")

    an den Quellcode prependen (bzw. einfach _checkBoxX.Value.ToString(), ist aber hässlich). Der VBCodeProvider kompiliert einfach einen bestehenden VB-Quelltext.

    Gruß
    ~blaze~

    SAR-71 schrieb:

    es gibt ja noch ne neuere Methode, jedoch ist mir der Name entfallen.
    Meinst du das RoslynCTP? Siehe hier:
    kürzesten Java (oder VB, C#) Code zum Rechnen mit (+; -; *; /) *ohne* RegEx o. ä.
    Darf man aber noch nicht produktiv nutzen (laut Lizenz). Kommt aber wohl in den nächsten .NET-Versionen.
    Von meinem iPhone gesendet
    Kann vllt jemand ein Beispiel Projekt Posten. Also z.B den Builder bei dem ich die checkboxen "Hintergrund grün" & "Hintergrund rot" zur Auswahl habe sowie einen "Create Exe" Button.

    Anhand der gecheckten Checkboxen hat die entstandene exe jeweils einen Roten oder einen grünen Hintergrund.

    Das wäre toll, dann kann ich das ganze besser kapiern und auch bei meinem Projekt anpassen :)

    Lg

    Edit:
    Bei zwei gecheckten Checkboxen muss natürlich ne Meldung kommen das das nicht geht, da die Form ja nur eine Hintergrundfarbe haben kann.
    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

    Funktion:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub _generate(ByVal FilePath As String, ByVal ProgramCode As String)
    2. On Error Resume Next
    3. Dim Compiler As ICodeCompiler = (New VBCodeProvider).CreateCompiler()
    4. Dim Parameters As New CompilerParameters()
    5. Dim cResults As CompilerResults
    6. Parameters.GenerateExecutable = True
    7. Parameters.OutputAssembly = FilePath
    8. Parameters.CompilerOptions = "/Target:winexe"
    9. Parameters.ReferencedAssemblies.Add("System.dll")
    10. Parameters.ReferencedAssemblies.Add("System.Data.dll")
    11. Parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll")
    12. Parameters.ReferencedAssemblies.Add("System.Drawing.dll")
    13. Parameters.ReferencedAssemblies.Add("System.Management.dll")
    14. Parameters.ReferencedAssemblies.Add("System.XML.dll")
    15. Parameters.MainClass = "Hauptklasse"
    16. cResults = Compiler.CompileAssemblyFromSource(Parameters, ProgramCode)
    17. If cResults.Errors.Count > 0 Then
    18. For Each CompilerError In cResults.Errors
    19. MessageBox.Show("Zeile: " & CompilerError.Line & vbNewLine & CompilerError.ErrorText, MsgBoxStyle.Critical)
    20. Next
    21. End If
    22. MsgBox("Fertig")
    23. End Sub


    Mit dieser Funktion kannst du deine Programme compilieren. Dort musst du deinen gesamten Code unterbringen. Die Farbe deiner Form kannst du dann variabel festlegen.
    Jedoch kann ich das für dich als Anfänger nicht empfehlen, damit zu arbeiten ist etwas komplexer.

    Erwarte aber nicht, dass jemand jetzt deine Arbeit macht. Ein bisschen Eigeninitiative gehört dazu.
    Wenn du ein explizites Problem hast, dann helfen wir gerne. Falls du aber sagst, dass du null verstanden hast und ein Beispiel brauchst, dann sieh dir lieber nochmal die Grundlagen an.



    Mfg.
    SAR
    Danke sehr!
    Das ist ja mal ein Ansatz. ^^
    Also ich verstehe jetzt nur nicht ganz wo ich den Code rein schreiben soll. Nehmen wir an ich habe die Option beim Start

    VB.NET-Quellcode

    1. MsgBox("Hallo")

    Auszuwählen. Wo muss ich das einbauen damit die erstellte Exe beim Start die MessageBox zeigt.
    Und das soll sie ja auch nur wenn die Checkbox einen Hacken hat.
    Andernfalls soll sie nicht angezeigt werden.
    C# Developer
    Learning C++

    VB.NET-Quellcode

    1. 'Deine Import-Klauseln, die 4 hier sind eigentlich die Wichtigsten
    2. Imports System
    3. Imports Microsoft.VisualBasic
    4. Imports System.Windows.Forms
    5. Imports System.Drawing
    6. Class Hauptklasse
    7. 'Hier kannst du Variablen deklarieren (u.a. auch deine Form)
    8. 'Beachte, dass die Variablen "Shared" sein müssen (Hab leider noch nicht rausgefunden, wie man drum rum kommt)
    9. '"Shared Dim DEINE_FORM As New Form" <- so würde das Beispielhaft aussehen
    10. Shared Sub Main()
    11. 'Hier kommt dein Code rein
    12. 'Bei einer Msg-Box wird dir das Fenster von der Msg angezeigt und danach wird das Programm beendet
    13. 'Um das zu verhindern kannst du am Ende den Befehl "Application.Run(DEINE_FORM)" schreiben
    14. End Sub
    15. End Class
    hm?

    In Classes kanst du nur öffentliche Variablen deklarieren.
    Alles weitere muss in Subs / FUnktionen geschehen, zmd. nach meinem
    Wissen.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    SAR-71 schrieb:

    Dim Compiler As ICodeCompiler = (New VBCodeProvider).CreateCompiler()

    "Public Overrides Function CreateCompiler() As System.CodeDom.Compiler.ICodeCompiler" ist veraltet: "Callers should not use the ICodeCompiler interface and should instead use the methods directly on the CodeDomProvider class.". C:\Users\BlackSky\documents\visual studio 2010\Projects\Exe aus Exe erzeugen!\Exe aus Exe erzeugen!\Form1.vb
    ;-/
    C# Developer
    Learning C++

    ~blaze~ schrieb:


    Oder einfach VBCodeProvider.CompileAssemblyFromSource.

    Gruß
    ~blaze~

    Okay.
    Und mein Code, also für den Aufbau der Form, wo kommt der rein, ich kriegs iwie net hin X(
    Und der Code der die eigentlichen Funktionen die meine exe machen soll beiinhaltet, wo kommt der rein?
    C# Developer
    Learning C++

    SAR-71 schrieb:

    Einfach ignorieren.
    Das Obsolete-Attribut wird nicht umsonst vergeben. In einem neuen Projekt obsolete Funktionen zu verwenden lässt sich mit der Installation von Windows XP auf einem neuen Rechner vergleichen. Das sollte man nur aus folgenen Gründen machen:
    1. Es geht nicht anders. (Software-Kompatibilität)
    2. Es geht nicht anders. (Hardware-Kompatibilität)
    3. Kein Geld bzw. "war noch über".

    ;)

    Mehr Infos zum Attribut gibt es hier:
    msdn.microsoft.com/en-us/libra…em.obsoleteattribute.aspx

    MSDN schrieb:

    Marking an element as obsolete informs the users that the element will be removed in future versions of the product.
    Irgendwann gibt es das also nicht mehr. Wenn du willst, dass du deinen Code in der Zukunft noch verwenden kannst, solltest du auf obsolete Methoden verzichten und dich nach Alternativen umsehen.
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

    Lies dir einfach mal die Dokumentation der Methode durch, dazu blendet Intellisense dir die ja eigentlich ein. Notfalls findest du auch auf der MSDN noch Informationen und evtl. auch ein Codesample dazu. Versuch' einfach mal, dich von da aus heranzuarbeiten, das bringt mehr, als wenn wir dir das vorkauen. Wozu willst du eigentlich eine neue Assembly erstellen? Häufig gibt's auch alternative Lösungen, z.B. Konfigurationsdateien, die beim Programmstart geladen werden und in deren Abhängigkeit eine Ausführung dann halt stattfindet.
    Sofern es eine alternative Lösung für die obsolete Methode gibt, sollte man sie verwenden, da sie halt einfach, wie der Name schon sagt, veraltet ist. Ich denke mal, dass zwar in den meisten Fällen eine Kompatibilität zu aktuellen Methoden vorhanden sein wird, aber es ist einfach unsauber, sie in "modernen" Projekten zu verwenden.

    Gruß
    ~blaze~
    Vllt sollte ich mir für jede Möglichkeit die ausgewählt werden kann ne exe erstellen die in die ressourcen packen und dann nach Bedingung die jewilige entpacken... ;O
    Is halt iwie unsauber und macht die Eigentliche Anwendung größer...

    Weil nach Bedingung ne Exe zu erstellen is echt schwer.
    Zudem find ich im Inet auch kein gescheites Beispielprojekt.
    Und mit CodeDom usw krieg ichs auch nich hin :pinch:

    Hat noch jemand ne Idee?
    C# Developer
    Learning C++