Share via


Exemplarische Vorgehensweise: Kompilieren einer Binärdatei in systemeigenen Code bei der Installation mit einer benutzerdefinierten Aktion

Sie können benutzerdefinierte Aktionen definieren, um Befehle anzugeben, die nach einer Installation ausgeführt werden. In dieser exemplarischen Vorgehensweise definieren Sie z. B. eine benutzerdefinierte Aktion und übergeben den Pfadnamen einer EXE-Datei an die CustomActionData-Eigenschaft, um die ausführbare Datei in systemeigenem Code zu kompilieren, nachdem die Anwendung installiert wurde.

Tipp

Ihr Computer zeigt möglicherweise für einige der Elemente der Visual Studio-Benutzeroberfläche in der folgenden Anleitung andere Namen oder Standorte an. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

So erstellen Sie eine bereitzustellende Webbrowseranwendung

  1. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

  2. Klicken Sie auf Windows Forms-Anwendung.

  3. Geben Sie als Name "BrowserSample" ein, und klicken Sie dann auf OK.

  4. Klicken Sie im Menü Ansicht auf Toolbox.

  5. Erweitern Sie Alle Windows Forms, und ziehen Sie ein Panel-Steuerelement oben links in das Formular.

  6. Ziehen Sie im Formular-Designer ein TextBox-Steuerelement und ein Button-Steuerelement in das Panel-Steuerelement.

  7. Ziehen Sie im Formular-Designer ein WebBrowser-Steuerelement unter das Panel-Steuerelement.

  8. Erweitern Sie die Größe des Formulars, damit alle Steuerelemente darin Platz haben.

  9. Doppelklicken Sie im Formular-Designer auf das Panel -Steuerelement.

  10. Ändern Sie im Eigenschaftenfenster die Dock-Eigenschaft unter Layout in Top.

  11. Doppelklicken Sie im Formular-Designer auf das WebBrowser-Steuerelement.

  12. Ändern Sie im Eigenschaftenfenster die Dock-Eigenschaft unter Layout in Fill.

  13. Doppelklicken Sie im Formular-Designer auf das Button-Steuerelement.

  14. Ändern Sie im Eigenschaftenfenster die Text-Eigenschaft unter "Darstellung" in "Go".

  15. Ändern Sie die Größe der Steuerelemente Form, Panel, Text, Button und WebBrowser entsprechend Ihren Anforderungen.

  16. Doppelklicken Sie im Formular-Designer auf die Schaltfläche Go.

    Die Codeansicht für die Form1-Codedatei wird angezeigt.

  17. Fügen Sie den folgenden Code hinzu, mit dem der Anwendung die Webbrowserfunktionalität hinzugefügt wird. Der Text im TextBox-Steuerelement ist die Adressleiste für das WebBrowser-Steuerelement, und die Aktion findet statt, wenn Sie auf die Schaltfläche Go klicken.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        WebBrowser1.Navigate(TextBox1.Text)
    End Sub
    
    private void button1_Click(object sender, EventArgs e)
    {
        webBrowser1.Navigate(textBox1.Text);
    }
    
  18. Drücken Sie F5, um den Browser zu testen.

    Das Formular wird geöffnet.

  19. Geben Sie im Textfeld "https://www.microsoft.com" ein, und klicken Sie dann auf Go.

    Die Microsoft-Website wird angezeigt.

So erstellen Sie die Klasse für benutzerdefinierte Aktionen

  1. Zeigen Sie im Menü Datei auf Hinzufügen, und klicken Sie auf Neues Projekt.

  2. Klicken Sie im Dialogfeld Neues Projekt hinzufügen auf Windows, und klicken Sie dann auf Klassenbibliothek.

  3. Geben Sie im Feld Name die Bezeichnung NGenCustomAction ein, und klicken Sie auf OK.

  4. Klicken Sie im Menü Projekt auf Neues Element hinzufügen.

  5. Klicken Sie im Dialogfeld Neues Element hinzufügen auf Allgemein und dann auf Installerklasse. Geben Sie in das Feld Name den Namen NGenCustomAction ein, und klicken Sie dann auf Hinzufügen.

    Tipp

    Stellen Sie sicher, dass Sie eine Installerklasse hinzufügen. Andernfalls fehlen in der Codedatei erforderliche using-Anweisungen.

  6. Löschen Sie im Projektmappen-Explorer die Class1-Codedatei im NGenCustomAction-Projekt.

So fügen Sie der benutzerdefinierten Aktion Code hinzu

  1. Klicken Sie im Projektmappen-Explorer (oder auf der Entwurfsoberfläche) mit der rechten Maustaste auf die NGenCustomAction-Codedatei, und klicken Sie dann auf Code anzeigen, um den Code-Editor zu öffnen. Fügen Sie den folgenden Code oben im Modul hinzu.

    Imports System.IO
    Imports System.Diagnostics
    
    using System.IO;
    using System.Diagnostics;
    
  2. Aktualisieren Sie die Klassendeklaration, um von der System.Configuration.Install.Installer-Klasse zu erben.

    Inherits System.Configuration.Install.Installer
    
    : System.Configuration.Install.Installer
    
  3. Fügen Sie in der NGenCustomAction-Codedatei die folgende Hilfsmethode hinzu, um die systemeigene Image-Codedatei für eine beliebige Assembly zu generieren.

        <System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)> _
    Private Sub ngenCA(ByVal savedState As System.Collections.IDictionary, ByVal ngenCommand As String)
            Dim argsArray As [String]()
    
            If String.Compare(ngenCommand, "install", StringComparison.OrdinalIgnoreCase) = 0 Then
                Dim args As [String] = Context.Parameters("Args")
                If [String].IsNullOrEmpty(args) Then
                    Throw New InstallException("No arguments specified")
                End If
    
                Dim separators As Char() = {";"c}
                argsArray = args.Split(separators)
                'It is Ok to 'ngen uninstall' assemblies which were not installed
                savedState.Add("NgenCAArgs", argsArray)
            Else
                argsArray = DirectCast(savedState("NgenCAArgs"), [String]())
            End If
    
            ' Gets the path to the Framework directory.
            Dim fxPath As String = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
    
            For i As Integer = 0 To argsArray.Length - 1
                Dim arg As String = argsArray(i)
                ' Quotes the argument, in case it has a space in it.
                arg = """" & arg & """"
    
                Dim command As String = (ngenCommand & " ") + arg
    
                Dim si As New ProcessStartInfo(Path.Combine(fxPath, "ngen.exe"), command)
                si.WindowStyle = ProcessWindowStyle.Hidden
    
                Dim p As Process
    
                Try
                    Context.LogMessage((">>>>" & Path.Combine(fxPath, "ngen.exe ")) + command)
                    p = Process.Start(si)
                    p.WaitForExit()
                Catch ex As Exception
                    Throw New InstallException("Failed to ngen " & arg, ex)
                End Try
            Next
        End Sub
    
            [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
            private void ngenCA(System.Collections.IDictionary savedState, string ngenCommand)
            {
                String[] argsArray;
    
                if (string.Compare(ngenCommand, "install", StringComparison.OrdinalIgnoreCase) == 0)
                {
                    String args = Context.Parameters["Args"];
                    if (String.IsNullOrEmpty(args))
                    {
                        throw new InstallException("No arguments specified");
                    }
    
                    char[] separators = { ';' };
                    argsArray = args.Split(separators);
                    savedState.Add("NgenCAArgs", argsArray); //It is Ok to 'ngen uninstall' assemblies which were not installed
                }
                else
                {
                    argsArray = (String[])savedState["NgenCAArgs"];
                }
    
                // Gets the path to the Framework directory.
                string fxPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();
    
                for (int i = 0; i < argsArray.Length; ++i)
                {
                    string arg = argsArray[i];
                    // Quotes the argument, in case it has a space in it.
                    arg = "\"" + arg + "\"";
    
                    string command = ngenCommand + " " + arg;
    
                    ProcessStartInfo si = new ProcessStartInfo(Path.Combine(fxPath, "ngen.exe"), command);
                    si.WindowStyle = ProcessWindowStyle.Hidden;
    
                    Process p;
    
                    try
                    {
                        Context.LogMessage(">>>>" + Path.Combine(fxPath, "ngen.exe ") + command);
                        p = Process.Start(si);
                        p.WaitForExit();
                    }
                    catch (Exception ex)
                    {
                        throw new InstallException("Failed to ngen " + arg, ex);
                    }
                }
            }
    
    
  4. Fügen Sie die folgende Prozedur in der NGenCustomAction-Codedatei hinzu, um die Prozeduren Install, Commit, Rollback und Uninstall der Basisklasse zu überschreiben.

    <System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)> _
    Public Overloads Overrides Sub Install(ByVal savedState As System.Collections.IDictionary)
        MyBase.Install(savedState)
        Context.LogMessage(">>>> ngenCA: install")
        ngenCA(savedState, "install")
    End Sub
    
    <System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)> _
    Public Overrides Sub Commit(ByVal savedState As System.Collections.IDictionary)
        MyBase.Commit(savedState)
        Context.LogMessage(">>>> ngenCA: commit")
    End Sub
    
    <System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)> _
    Public Overloads Overrides Sub Uninstall(ByVal savedState As System.Collections.IDictionary)
        MyBase.Uninstall(savedState)
        Context.LogMessage(">>>> ngenCA: uninstall")
        ngenCA(savedState, "uninstall")
    End Sub
    
    <System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)> _
    Public Overloads Overrides Sub Rollback(ByVal savedState As System.Collections.IDictionary)
        MyBase.Rollback(savedState)
        Context.LogMessage(">>>> ngenCA: rollback")
        ngenCA(savedState, "uninstall")
    End Sub
    
    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Install(System.Collections.IDictionary savedState)
    {
        base.Install(savedState);
        Context.LogMessage(">>>> ngenCA: install");
        ngenCA(savedState, "install");
    }
    
    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Commit(IDictionary savedState)
    {
        base.Commit(savedState);
        Context.LogMessage(">>>> ngenCA: commit");
    }
    
    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Uninstall(System.Collections.IDictionary savedState)
    {
        base.Uninstall(savedState);
        Context.LogMessage(">>>> ngenCA: uninstall");
        ngenCA(savedState, "uninstall");
    }
    
    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Rollback(System.Collections.IDictionary savedState)
    {
        base.Rollback(savedState);
        Context.LogMessage(">>>> ngenCA: rollback");
        ngenCA(savedState, "uninstall");
    }
    

So fügen Sie ein Bereitstellungsprojekt für die Browser Sample-Anwendung hinzu

  1. Zeigen Sie im Menü Datei auf Hinzufügen, und klicken Sie auf Neues Projekt.

  2. Erweitern Sie im Dialogfeld Neues Projekt hinzufügen den Knoten Andere Projekttypen, erweitern Sie Setup und Bereitstellungsprojekte, klicken Sie auf Visual Studio Installer, und klicken Sie dann auf Setup-Projekt.

  3. Geben Sie im Feld Name die Bezeichnung Browser Sample Installer ein, und klicken Sie dann auf OK.

  4. Wählen Sie im Dateisystem-Editor den Anwendungsordner aus. Klicken Sie im Menü Aktion auf Hinzufügen.

    Das Dialogfeld "Projektausgabegruppe hinzufügen" wird angezeigt.

  5. Wählen Sie im Dropdown-Kombinationsfeld "Projekt" den Eintrag "BrowserSample" aus, klicken Sie auf Projektausgabe und dann auf OK.

  6. Wählen Sie im Dateisystem-Editor den Anwendungsordner aus. Klicken Sie im Menü Aktion auf Hinzufügen.

    Das Dialogfeld "Projektausgabegruppe hinzufügen" wird angezeigt.

  7. Wählen Sie im Dropdown-Kombinationsfeld "Projekt" den Eintrag "NGenCustomAction" aus, klicken Sie auf Projektausgabe und dann auf OK.

So fügen Sie dem Setup-Projekt eine benutzerdefinierte NGEN-Aktion hinzu

  1. Klicken Sie im Projektmappen-Explorer auf das Projekt Browser Sample Installer.

  2. Zeigen Sie im Menü Ansicht auf Editor, und klicken Sie auf Benutzerdefinierte Aktionen.

  3. Wählen Sie im Editor für benutzerdefinierte Aktionen den Knoten Benutzerdefinierte Aktion.

  4. Klicken Sie im Menü Aktion auf Benutzerdefinierte Aktion hinzufügen.

  5. Doppelklicken Sie im Dialogfeld Element im Projekt auswählen auf den Anwendungsordner, klicken Sie auf Primäre Ausgabe von NGenCustomAction (Aktiv), und klicken Sie dann auf OK.

    Allen vier benutzerdefinierten Aktionsknoten wird die benutzerdefinierte NGen-Aktion hinzugefügt.

  6. Klicken Sie im Knoten Installieren auf Primäre Ausgabe von NGenCustomAction (Aktiv).

  7. Ändern Sie im Eigenschaftenfenster die CustomActionData-Eigenschaft in /Args="[TARGETDIR]BrowserSample.exe". Schließen Sie die Anführungszeichen ein.

    Tipp

    Die [TARGETDIR] Eigenschaft gibt den Speicherort der installierten ausführbaren Datei an. Die benutzerdefinierte Aktion konvertiert die installierte ausführbare Datei mithilfe von "ngen.exe" in ein systemeigenes Image.

  8. Klicken Sie im Projektmappen-Explorer auf das Setup-Projekt Browser Sample Installer.

  9. Klicken Sie im Menü Erstellen auf Browser Sample Installer erstellen.

So überprüfen Sie die Generierung des systemeigenen Codes

  1. Navigieren Sie zum Installationsordner, und suchen Sie die Datei "BrowserSample.exe". Beispiel: %PROGRAMME%\CompanyName\Brower Sample Installer\BrowserSample.exe.

  2. Überprüfen Sie in einer Visual Studio-Eingabeaufforderung, ob die ausführbare Datei in systemeigenem Code vorkompiliert wurde, indem Sie den folgenden Code ausführen:

    ngen.exe display FullPathToExe
    

    Sie können z. B. den folgenden Befehl ausführen:

    ngen.exe display "C:\Program Files (x86)\Microsoft\Browser Sample Installer\BrowserSample.exe"
    

    Die Befehlsausgabe wird angezeigt.

    Microsoft (R) CLR Native Image Generator - Version 4.0.21102.0
    Copyright (c) Microsoft Corporation.  All rights reserved.
    
    NGEN Roots:
    
    C:\Program Files (x86)\Microsoft\Browser Sample Installer\BrowserSample.exe
    
    NGEN Roots that depend on "c:\Program Files (x86)\Microsoft\Browser Sample Installer\BrowserSample.exe":
    
    C:\Program Files (x86)\Microsoft\Browser Sample Installer\BrowserSample.exe
    
    Native Images:
    
    BrowserSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null <debug>
    

    Tipp

    Wenn ngen.exe kein systemeigenes Image anzeigt, finden in einem der folgenden Verzeichnisse entsprechende Protokolle:

    %SystemRoot%\Microsoft.NET\Framework\v<CLR-Version> %SystemRoot%\Microsoft.NET\Framework64\v<CLR-Version>

    Die Datei ngen.log enthält das aktuelle Problembehandlungsprotokoll.

Siehe auch

Referenz

CustomActionData-Eigenschaft

Ngen.exe (Native Image Generator)

Konzepte

Der verwaltete Ausführungsprozess

Weitere Ressourcen

Verwalten von benutzerdefinierten Aktionen bei der Bereitstellung