Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0033: Code aus dem eigenen Programm heraus kompilieren

 von 

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:

Schwierigkeitsgrad 1

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:

Download des Beispielprojektes [4,45 KB]

' 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 ... )