VB.NET-Tipp 0033: Code aus dem eigenen Programm heraus kompilieren
von Herfried Wagner
Beschreibung
Dieses Beispiel zeigt, wie man zur Laufzeit aus einer .NET-Anwendung heraus eine einfache .NET-Anwendung erstellen kann. Der Benutzer kann den Quellcode eingeben, einige Einstellungen treffen und den Code anschliessend kompilieren und ausführen.
Schwierigkeitsgrad: | Framework-Version(en): .NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5 | .NET-Version(en): Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008 | Download: |
' Dieser Quellcode stammt von http://www.activevb.de ' und kann frei verwendet werden. Für eventuelle Schäden ' wird nicht gehaftet. ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. ' Ansonsten viel Spaß und Erfolg mit diesem Source! ' Projektversion: Visual Studio 2002/2003 ' Option Strict: An ' Option Explicit: An ' ' Referenzen: ' - System ' - System.Drawing ' - System.Windows.Forms ' ' ############################################################################## ' ################################ MainForm.vb ################################# ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary Imports Microsoft.CSharp Imports Microsoft.VisualBasic Imports System Imports System.CodeDom.Compiler Imports System.Diagnostics Imports System.Reflection Imports System.Windows.Forms ' <remarks> ' Hauptformular der Anwendung. ' </remarks> Public Class MainForm Inherits System.Windows.Forms.Form Private Sub btnCompileAndRun_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnCompileAndRun.Click ' Benutzereingaben prüfen. If Me.txtApplicationName.TextLength = 0 Then MessageBox.Show("Der Anwendungsname darf nicht leer sein!", _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return ElseIf Me.txtMainClassName.TextLength = 0 Then MessageBox.Show("Der Name der Hauptklasse darf nicht leer sein!", _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return End If ' Je nach Einstellung für VB .NET oder C# kompilieren. Dim cdp As CodeDomProvider If Me.cboLanguage.SelectedIndex = 0 Then cdp = New VBCodeProvider() Else cdp = New CSharpCodeProvider() End If ' Konfigurieren des Compilers. Dim compiler As ICodeCompiler = cdp.CreateCompiler() Dim cpParameters As CompilerParameters = New CompilerParameters() With cpParameters .GenerateExecutable = True .OutputAssembly = Me.txtApplicationName.Text .MainClass = Me.txtMainClassName.Text .IncludeDebugInformation = chkIncludeDebugInfo.Checked ' Verfügbare Assemblies hinzufügen. Für unsere einfache ' Anwendung sollte dies ausreichend sein. Dim asm As [Assembly] For Each asm In AppDomain.CurrentDomain.GetAssemblies() .ReferencedAssemblies.Add(asm.Location) Next asm End With ' Kompilieren der Assembly. Dim strCode As String = Me.txtSource.Text Dim cr As CompilerResults = _ compiler.CompileAssemblyFromSource(cpParameters, strCode) If cr.Errors.Count > 0 Then Dim strErrors As String = _ "Kompilierung ist fehlgeschlagen" & ControlChars.NewLine Dim cerr As CompilerError For Each cerr In cr.Errors strErrors &= ControlChars.NewLine & cerr.ToString() Next cerr MessageBox.Show(strErrors, _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return End If ' Kompilierung war erfolgreich, versuche die erstellte Anwendung ' auszuführen. Try If Not System.IO.File.Exists(Me.txtApplicationName.Text) Then MessageBox.Show( _ String.Format("Die Datei ""{0}"" kann nicht gefunden " & _ "und daher auch nicht ausgeführt werden!", _ Me.txtApplicationName.Text), _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return End If Dim psi As ProcessStartInfo = _ New ProcessStartInfo(Me.txtApplicationName.Text) Process.Start(psi) Catch ex As Exception MessageBox.Show( _ String.Format("Fehler beim Ausführen von ""{0}""!", _ Me.txtApplicationName.Text), _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) End Try End Sub End Class
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Tobi am 03.12.2009 um 20:01
Danke für den tollen Tipp!
Wie kann ich ein Icon für die fertige *.exe-Datei festlegen? Ich weiss bereits, dass Windows immer das erste Icon in der Resourcen-Datei als Symbol benutzt. Außerdem habe ich herrausgefunden, dass es in System.CodeDom.Compiler.CompilerParameters eine Eigenschaft namens Win32Resource gibt, mit der man Resourcendateien einbinden kann. Alle meine bisherigen Versuche die Resourcendatei mit dem Icon manuell zu erzeugen , sind schiefgegangen. Gibt es vielleicht irgendwo eine .NET-Methode, mit der ich diese Aufgabe erledigen kann?
@Kwons:Ich glaube, copyright, etc kommt auch in die Resourcen-Datei. Lade dir doch mal Resource Hacker runter (http://www.chip.de/downloads/Resource-Hacker-3.4.0_13004038.html) und untersuche die Resourcen-Dateie von ein paar *.exe .
@Julius:Wie wäre es mit http://msdn.microsoft.com/de-de/library/ms123458%28VS.80%29.aspx ? (Du musst etwas nach unten scrollenm, um zu den Links zu System.Windows.Forms, etc. zu kommen)
Kommentar von Julius_1 am 21.05.2006 um 22:37
Meine _Fragen: Gibt es im internet eine Auflistung aller Bibliotheken, die ausführlich beschrieben werden indeutscher Sprache? Sie haben z.B. in ihrem Tipp 33 System.Windows.Forms usw. verwendet.
Kann man mit VB.Net eine Exe erstellen die alleine lauffähig ist?
Kommentar von Kwons am 10.12.2005 um 03:45
Funktioniert, würde aber doch gerne auch mal wissen wie ich die genaue Daten hier festlegen kann für die Assembly !?!
( Für Copyright, Beschreibung, usw ... )