Eigene EXE-Datei erstellen

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Eigene EXE-Datei erstellen

    Einen schönen guten Abend,
    mit welchem Code "kompiliert" man eine eigene EXE-Datei, die z.B. Eine TextBox hat, wo man was hereinschreiben kann usw...
    Ich will eigentlich darauf hinaus, ein eigenes Programmier-Programm (ohne Code) zu erstellen. Ganz sooo schwer müsste das ja nicht sein oder? Der "knackepunkt" ist eben nur die EXE-Datei zu kompilieren.

    P.S.: Bitte seht das nicht als Anfängerfrage. Ich weiß, wie man in VB debuggt. Das ist mit dieser Frage auch nicht gemeint. Ich möchte, wie schon erwähnt, ungefähr genauso etwas wie VB erstellen, nur ohne Code-Eingabe. Man kann dann einfach auswählen, was das Programm können soll und fertig.
    Tut mir leid aber irgendwie weißt du selbst nicht ganz was du willst? Willst du so ne Art Workflowprinzip?
    Es ist so der "Knackpunkt" liegt dann nen ganz ganz ganz kleines Bisschen über deinem Können (zumindest mein Eindruck).

    Ansonsten kannste das über "Commandline" compilieren oder eben mit codedom.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ich glaube ich weis was du meinst.

    Wie thefiloe schon gesagt hat. Das geht mit codedom.

    Man nehme also eine neue Windows Form füge darauf einen Button und zwei Textboxen hinzu. Und nutze folgenden Code^^

    Quellcode

    1. Option Strict On
    2. Imports System.CodeDom.Compiler
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Dim Provider As New VBCodeProvider()
    6. Dim Icc As ICodeCompiler = Provider.CreateCompiler
    7. Dim Datei As String = TextBox3.Text & ".exe"
    8. TextBox2.Text = ""
    9. Dim para As New CompilerParameters()
    10. Dim res As CompilerResults
    11. para.GenerateExecutable = True
    12. para.OutputAssembly = Datei
    13. res = Icc.CompileAssemblyFromSource(para, TextBox1.Text)
    14. If res.Errors.Count > 0 Then
    15. TextBox2.ForeColor = Color.Red
    16. Dim Err As CompilerError
    17. For Each Err In res.Errors
    18. TextBox2.Text = TextBox2.Text & _
    19. "Zeile: " & Err.Line & " Fehlernummer: " & Err.ErrorNumber & " Fehlertext: " & Err.ErrorText & _
    20. Environment.NewLine
    21. Next
    22. Else
    23. TextBox2.ForeColor = Color.Blue
    24. TextBox2.Text = "Projekt wurde erfolgreich erstellt!"
    25. End If
    26. End Sub
    Ist das der Code für einen Compiler?
    Also, vielleicht habe ich mich ein wenig blöd ausgedrückt.
    Ich möchte soetwas gleiches wie Visual Basic erstellen. Das heißt man kann sich sein eigenes Programm (auch ohne VB auf dem Computer zu haben) compilen. VB erstellt ja EXE-Dateien. Ich möchte auch mit meinem selbst geschriebenen Programm EXE/Dateien erstellen k;nnen. Aber leider kenn ich den Code f[r einen Compiler nicht.
    Ps> Entschuldigt die komischen Yeichen in meinen S'tyen. Irgendwas ist mit der Tastatur. Nur mal so als peinliche Ywischenfrage> Wie bekomme ich die olle Tastaturmanipulation wieder heraus_

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Michael K.“ ()

    Hallo Micheal,

    mittels der CodeDom Klasse kannst du den VB Compiler "ansteuern".
    Diesem kannst du VB Code (als String) geben, und er wird ihn dir als Kompilat (.exe) herausgeben.

    Wenn du eine "eigene" Sprache machen möchtest, kannst du diese einfach in VB.net wandeln.

    Gruß,
    Manawyrm

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

    Ohne VB auf dem PC zu haben.

    Was meinst du damit?
    Ohne .NET Framework?

    Aber leider kenn ich den Code f[r einen Compiler nicht.


    Das ist auch nicht trivial. Du kannst ja mal versuchen, irgendwas in Maschinencode zu übersetzen ^^
    Das ist meine Signatur und sie wird wunderbar sein!
    Oh, schade. Man bracht Visual Basic wirklich, um eine eigene EXE-Datei, die nicht mit dem VB Compiler gemacht wurde zu erstellen? Mein Ziel ist es eigentlich ein eigenes Programmier-Programm zu erstellen. Naja, schade.
    Was ist denn mit Cells Code? Der sieht ganz gut aus, aber wie wende ich ihn an? Ich habe da noch so einen:

    VB.NET-Quellcode

    1. folgt...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Michael K.“ ()

    Okay, sorry.
    Kann ich? Okay, wie gesagt. Ich habe da noch so einen Code. Anscheinend soll da eine EXE-erstellt werden. Aber wie wende ich ihn an?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Beispiel: VB .Net - Exe Datei zur Laufzeit von Code erstellen
    2. 'Hinweis : Die neue .exe Datei wird im Anwendungspfad erzeugt.
    3. '
    4. Option Explicit On
    5. Option Strict On
    6. Imports System.CodeDom.Compiler
    7. Imports System.Reflection
    8. Imports System.Text
    9. Imports System.Environment
    10. Public Class Form1
    11. Private Structure OutputTarget
    12. Public Exe As String 'Bewirkt, dass der Compiler eine ausf?hrbare Konsolenanwendung erstellt.
    13. Public Library As String 'Bewirkt, dass der Compiler eine Dynamic Link Library (DLL) erstellt.
    14. Public [Module] As String 'Bewirkt, dass der Compiler ein Modul generiert, das einer Assembly hinzugef?gt werden kann.
    15. Public WinExe As String 'Bewirkt, dass der Compiler ein ausf?hrbares Windows-Programm erstellt.
    16. End Structure
    17. Private ot As New OutputTarget
    18. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    19. With Me
    20. .CenterToScreen()
    21. Call Code() : .TextBox1.Text = .SetSourceCode()
    22. With ot
    23. .Exe = "/target:exe"
    24. .Library = "/target:library"
    25. .[Module] = "/target:module"
    26. .WinExe = "/target:winexe"
    27. End With
    28. .CheckBox1.Text = "Show new .exe file?"
    29. .CheckBox1.Checked = True
    30. End With
    31. End Sub
    32. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    33. Handles Button1.Click
    34. Dim ErrorMessage As String = ""
    35. Dim Result As Boolean = Me.CreateNewExefileFromCode(Helper.AppPath & "test.exe", Me.TextBox1.Text, ErrorMessage)
    36. Select Case Result
    37. Case True
    38. MessageBox.Show(".Exe wurde angelegt...", "Info")
    39. If Me.CheckBox1.Checked Then
    40. Try
    41. Dim psi As ProcessStartInfo = New ProcessStartInfo()
    42. With psi
    43. .ErrorDialog = True
    44. .UseShellExecute = False
    45. .WorkingDirectory = Helper.AppPath
    46. .FileName = IO.Path.Combine(.WorkingDirectory, "test.exe")
    47. End With
    48. Process.Start(psi)
    49. Catch ex As Exception
    50. MessageBox.Show(ex.Message.ToString(), "Info - Exception")
    51. End Try
    52. End If
    53. Case Else
    54. MessageBox.Show(ErrorMessage & NewLine & ".Exe wurde nicht angelegt...", "Info")
    55. End Select
    56. End Sub
    57. Public Class Helper
    58. Public Shared ReadOnly Property AppPath() As String
    59. Get
    60. Dim Path As String = Application.StartupPath
    61. If Path.EndsWith("\") = False Then Path &= "\"
    62. Return Path
    63. End Get
    64. End Property
    65. End Class
    66. Private Sub Code()
    67. Dim sb As New System.Text.StringBuilder
    68. With sb
    69. .Append("'Beispiel: VB .Net - Test-Code")
    70. .Append("\n\n" & "Imports System")
    71. .Append("\n" & "Imports System.Windows.Forms")
    72. .Append("\n" & "Imports Microsoft.VisualBasic")
    73. .Append("\n\n" & "Public Class Form1")
    74. .Append("\n" & "'")
    75. .Append("\n" & "End Class")
    76. .Append("\n" & "'")
    77. .Append("\n" & "Module Module1")
    78. .Append("\n" & "'")
    79. .Append("\n" & "Sub Main(ByVal args() As String)")
    80. .Append("\n" & "MsgBox(" & """" & "Hallo" & """" & ")")
    81. .Append("\n" & "End Sub")
    82. .Append("\n" & "'")
    83. .Append("\n" & "End Module")
    84. .Replace("\n", NewLine)
    85. Me._source = sb.ToString()
    86. End With
    87. End Sub
    88. Private _source As String
    89. Private Property SetSourceCode() As String
    90. Get
    91. Return Me._source
    92. End Get
    93. Set(ByVal value As String)
    94. Me._source = value
    95. End Set
    96. End Property
    97. Private Function CreateNewExefileFromCode( _
    98. ByVal NewFilename As String, ByVal SourceCode As String, ByRef ErrorMessage As String) As Boolean
    99. Dim cdp As CodeDomProvider = CodeDomProvider.CreateProvider("VB")
    100. Dim Parameters As CompilerParameters = New CompilerParameters()
    101. With Parameters
    102. .GenerateExecutable = True
    103. .OutputAssembly = NewFilename
    104. .CompilerOptions = ot.WinExe
    105. For Each [Implements] As Assembly In AppDomain.CurrentDomain.GetAssemblies()
    106. .ReferencedAssemblies.Add([Implements].Location)
    107. Next
    108. Dim cr As CompilerResults = cdp.CompileAssemblyFromSource(Parameters, SourceCode)
    109. With cr
    110. If .Errors.Count > 0 Then
    111. Dim ErrorListIndex As Integer = 0
    112. ErrorMessage = .Errors(ErrorListIndex).ToString() : Return False
    113. End If
    114. Return True
    115. End With
    116. End With
    117. End Function
    118. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    119. Handles Button2.Click
    120. Me.TextBox1.Text = ""
    121. Dim ofd As OpenFileDialog = New OpenFileDialog()
    122. Try
    123. With ofd
    124. .Title = "Open Example Code"
    125. .InitialDirectory = Application.StartupPath
    126. .FileName = "source.txt"
    127. .Filter = "Text File|*.txt"
    128. If .ShowDialog = Windows.Forms.DialogResult.OK Then
    129. Using sr As IO.StreamReader = New IO.StreamReader(.FileName)
    130. Me.TextBox1.Text = sr.ReadToEnd()
    131. End Using
    132. End If
    133. End With
    134. Catch ex As Exception
    135. MessageBox.Show(ex.Message.ToString(), "Info")
    136. End Try
    137. End Sub
    138. End Class



    Was passiert mir immer, wenn ich diesen Code ausführe: Es erscheint immer die Case Else Meldung. Irgendwas mache ich falsch. Dieser Code ist von einer Website. Ich habe ihn mir schon genau angeschaut, aber an der Case Else Meldung "hagt" es.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Michael K.“ ()

    Michael K. schrieb:

    Es erscheint immer die Case Else Meldung
    Könntest du mal erklären, was du unter einer "Case Else"-Meldung verstehst? Bzw. Fehlermeldung + Zeile posten?
    Ist das der Code für einen Compiler?
    Also, vielleicht habe ich mich ein wenig blöd ausgedrückt.
    Ich möchte soetwas gleiches wie Visual Basic erstellen. Das heißt man kann sich sein eigenes Programm (auch ohne VB auf dem Computer zu haben) compilen. VB erstellt ja EXE-Dateien. Ich möchte auch mit meinem selbst geschriebenen Programm EXE/Dateien erstellen k;nnen. Aber leider kenn ich den Code f[r einen Compiler nicht.


    Nein das ist nicht der Code für einen Compiler. Das wäre auch ein bischen wenig Code für einen Compiler wenn du mich fragst.

    Du hast dich meiner Meinung nach garnicht blöd ausgedrückt. Du willst einfach VB Code in eine Textbox schreiben und per klick auf einen Button Compilieren. Genau das macht der Code den ich auch schon oben gepostet habe. Allerdings Compilliert er nciht selber, sondern lässt das Framework die Arbeit machen. Im Framwork ist nämlich der entsprechende Compiler integriert den man dann auch über di3e codedom Klasse ansprechen kann.
    Das beantwortet auch die nächste Frage bzw berichtige die Falschaussage:
    Selbst kannst du kein Compiler schreiben, du müsstest schon den von VB nehmen, aber der is nicht an die VB IDE gebunden, also es muss nicht Visual Basic Installiert sein, dein Compiler müsstest aber mit deinem Programm mitbringen.


    Das ist nicht korrekt denn wie ich bereits geschrieben habe ist der Compiler im Framework enthalten. Ich glaube seit 2.0

    Demnach brauchst du gar nichts außer den bereits zur verfügung gestellten Code.

    Was ist denn mit Cells Code? Der sieht ganz gut aus, aber wie wende ich ihn an? Ich habe da noch so einen:


    Hatte ich doch schon in meinem ersten Post geschrieben. Erstelle ein neues VB Projekt und platziere in Designer 2 Textboxen und einen Button. Anschließend wechselst du zum Code Designer und fügst den von mir zur Verfügung gestrellten Code ein. Dann einfach mal testen.

    Bevor du dich dann darüber freust das das auch funktioniert ( Ich habs ja schon getestet :D ) solltest du dann nochmal kurz in dich gehen und versuchen den Code zu verstehen.
    Du kannst mit etwas einfachem anfangen, zum Beispiel einem Parser für LL-Sprachen.
    Wenn du einen Syntaxbaum hast, kannst du den relativ einfach in Maschineninstruktionen transformieren (indem du für jede Regel eine Transformation angibst) und dann ins PE-Format gießen. Falls du dich das gerade fragen solltest: Ja, jede LL(1)-Sprache ist auch eine LR(1)-Sprache.
    Du kannst auch mal mit Yacc experimentieren; das ist durchaus sehr lehrreich.