Share via


Podrobné pokyny: Použití vlastní akce pro kompilaci binárního kódu do nativního kódu při instalaci

Chcete-li zadat příkazy, které jsou spuštěny po instalaci, můžete definovat vlastní akce. V tomto návodu například definujeme vlastní akci a předáváme název cesty EXE souboru do vlastnosti CustomActionData. Pak se tento spustitelný soubor po instalaci aplikace zkompiluje do nativního kódu.

Poznámka

Ve vašem počítači se pro některé z prvků uživatelského rozhraní aplikace Visual Studio mohou zobrazit jiné názvy a umístění, než jsou uvedena v následujících pokynech. Tyto prvky jsou určeny verzí aplikace Visual Studio a použitým nastavením. Další informace naleznete v tématu Visual Studio, nastavení.

Vytvoření aplikace webového prohlížeče k nasazení

  1. V nabídce File (Soubor) přejděte na příkaz New (Nový) a klepněte na příkaz Project (Projekt).

  2. Klikněte na Formulářová aplikace Windows.

  3. Pro Název zadejte BrowserSample a klikněte na tlačítko OK.

  4. V nabídce Zobrazit klepněte na příkaz Sada nástrojů.

  5. Rozbalte All Windows Forms a přetáhněte ovládací prvek Panel do horní levé části formuláře.

  6. V návrháři formuláře přetáhněte ovládací prvky TextBox a Button do ovládacího prvku Panel.

  7. V návrháři formuláře přetáhněte ovládací prvek WebBrowser pod ovládací prvek Panel.

  8. Zvětšete velikost formuláře tak, aby se do něj vešly všechny ovládací prvky.

  9. V návrháři formuláře klikněte na ovládací prvek Panel.

  10. V okně Vlastnosti změňte vlastnost Dock v oddíle Rozložení na Top.

  11. V návrháři formuláře klikněte na ovládací prvek WebBrowser.

  12. V okně Vlastnosti změňte vlastnost Dock v oddíle Rozložení na Fill.

  13. V návrháři formuláře klikněte na ovládací prvek Button.

  14. V okně Vlastnosti změňte vlastnost Text v oddíle Vzhled na Přejít:

  15. Změňte velikost ovládacích prvků Form, Panel, Textbox, Button a WebBrowser podle vašich představ.

  16. V návrháři formuláře dvakrát klikněte na tlačítko Přejít.

    Zobrazí se zobrazení kódu pro soubor kódu Form1.

  17. Přidejte následující kód, který do aplikace přidává funkce webového prohlížeče. Text v ovládacím prvku TextBox je panel adresy pro ovládací prvek WebBrowser a akce je provedena po kliknutí na tlačítko Přejít.

    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. Chcete-li otestovat prohlížeč, stiskněte klávesu F5.

    Formulář se otevře.

  19. Do textového pole zadejte https://www.microsoft.com a pak klikněte na tlačítko Přejít.

    Objeví se web společnosti Microsoft,

Vytvoření třídy vlastní akce

  1. V nabídce Soubor přejděte na Přidat a klikněte na Nový projekt.

  2. V dialogovém okně Přidat nový projekt klikněte na Windows a potom klikněte na Knihovna tříd.

  3. Do pole Název zadejte NGenCustomAction a pak klikněme na tlačítko OK.

  4. V nabídce Project (Projekt) klepněte na příkaz Add New Item (Přidat novou položku).

  5. V dialogovém okně Přidat novou položku klikněte na Obecné a pak klikněte na Instalační třída. Do pole Název zadejte NGenCustomAction a pak klikněte na tlačítko Přidat.

    Poznámka

    Ujistěte se, že přidáte Instalační služba třídy; jinak kód souboru nebude mít nezbytné using prohlášení.

  6. V okně Průzkumník řešení v projektu NGenCustomAction odstraňte soubor kódu Class1.

Přidání kódu do vlastní akce

  1. Klikněte pravým tlačítkem myši na soubor kódu NGenCustomAction v okně Průzkumník řešení (nebo na návrhové ploše) a pak klikněte na Zobrazení kódu, čímž se otevře Editor kódu. Následující kód přidejte do horní části modulu:

    Imports System.IO
    Imports System.Diagnostics
    
    using System.IO;
    using System.Diagnostics;
    
  2. Aktualizujte deklaraci třídy tak, aby dědila ze třídy System.Configuration.Install.Installer.

    Inherits System.Configuration.Install.Installer
    
    : System.Configuration.Install.Installer
    
  3. Do souboru kódu NGenCustomAction přidejte následující pomocnou metodu, která pro libovolné sestavení generuje soubor nativního obrazu.

        <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. Do souboru kódu NGenCustomAction přidejte následujícím proceduru, čímž přepíšete procedury Install, Commit, Rollback a Uninstall základní třídy.

    <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");
    }
    

Přidání projektu nasazení pro ukázkovou aplikaci webového prohlížeče

  1. V nabídce Soubor přejděte na Přidat a klikněte na Nový projekt.

  2. V dialogovém okně Přidat nový projekt rozbalte Ostatní typy projektů, rozbalte Projekty instalace a nasazení, klikněte na Instalační program Visual Studio a pak klikněte na Projekt instalace.

  3. Do pole Název zadejte Browser Sample Installer a pak klikněte na tlačítko OK.

  4. V okně Editor systému souborů vyberte Složka aplikace. V nabídce Akce klikněte na Přidat akci.

    Zobrazí se dialogové okno Přidat výstupní skupinu projektu.

  5. V rozevíracím seznamu Projekt vyberte BrowserSample, klikněte na Výstup projektu a potom klikněte na tlačítko OK.

  6. V okně Editor systému souborů vyberte Složka aplikace. V nabídce Akce klikněte na Přidat akci.

    Zobrazí se dialogové okno Přidat výstupní skupinu projektu.

  7. V rozevíracím seznamu Projekt vyberte NGenCustomAction, klikněte na Výstup projektu a potom klikněte na tlačítko OK.

Přidání vlastní akce NGEN do projektu instalace

  1. V okně Průzkumník řešení klikněte na projekt Browser Sample Installer.

  2. V nabídce Zobrazení přejděte na Editor a potom klikněte na Vlastní akce.

  3. V okně Editor vlastních akcí vyberte uzel Vlastní akce.

  4. V nabídce Akce klikněte na Přidat vlastní akci.

  5. V dialogovém okně Select Item in Project dvakrát klikněte na Složka aplikace, klikněte na Primární výstup z NGenCustomAction (aktivní) a potom klikněte na tlačítko OK

    Vlastní akce NGen je přidána do všech čtyř uzlů vlastní akce.

  6. V uzlu Install klikněte na Primární výstup z NGenCustomAction (aktivní).

  7. V okně Vlastnosti změňte vlastnostCustomActionData na /Args="[TARGETDIR]BrowserSample.exe". Příkaz zadejte včetně uvozovek.

    Poznámka

    Vlastnost [TARGETDIR] je umístění nainstalovaného spustitelného souboru. Vlastní akce použije ngen.exe k převedení nainstalovaného spustitelného souboru na nativní obraz.

  8. V okně Průzkumník řešení klikněte na projekt instalaceBrowser Sample Installer.

  9. V nabídce Sestavení klikněte na Sestavit Browser Sample Installer.

Ověření generování nativního kódu

  1. Přejděte do instalační složky a najděte soubor BrowserSample.exe. Například %PROGRAMFILES%\CompanyName\Brower Sample Installer\BrowserSample.exe..

  2. Spuštěním následujícího kódu v příkazové řádce sady Visual Studio ověřte, že byl spustitelný soubor předkompilován do nativního kódu:

    ngen.exe display FullPathToExe
    

    Zadejte například následující příkaz:

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

    Zobrazí se výstup příkazu.

    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>
    

    Poznámka

    Pokud ngen.exe nezobrazí nativní obraz, můžete najít ngen protokoly v jednom z následujících adresářů:

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

    Soubor ngen.log obsahuje nejnovější informace pro řešení potíží.

Viz také

Odkaz

vlastnost CustomActionData

Ngen.exe (Native Image Generator)

Koncepty

Proces spravovaného spouštění

Další zdroje

Správa vlastních akcí při nasazení