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í
V nabídce File (Soubor) přejděte na příkaz New (Nový) a klepněte na příkaz Project (Projekt).
Klikněte na Formulářová aplikace Windows.
Pro Název zadejte BrowserSample a klikněte na tlačítko OK.
V nabídce Zobrazit klepněte na příkaz Sada nástrojů.
Rozbalte All Windows Forms a přetáhněte ovládací prvek Panel do horní levé části formuláře.
V návrháři formuláře přetáhněte ovládací prvky TextBox a Button do ovládacího prvku Panel.
V návrháři formuláře přetáhněte ovládací prvek WebBrowser pod ovládací prvek Panel.
Zvětšete velikost formuláře tak, aby se do něj vešly všechny ovládací prvky.
V návrháři formuláře klikněte na ovládací prvek Panel.
V okně Vlastnosti změňte vlastnost Dock v oddíle Rozložení na Top.
V návrháři formuláře klikněte na ovládací prvek WebBrowser.
V okně Vlastnosti změňte vlastnost Dock v oddíle Rozložení na Fill.
V návrháři formuláře klikněte na ovládací prvek Button.
V okně Vlastnosti změňte vlastnost Text v oddíle Vzhled na Přejít:
Změňte velikost ovládacích prvků Form, Panel, Textbox, Button a WebBrowser podle vašich představ.
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.
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); }
Chcete-li otestovat prohlížeč, stiskněte klávesu F5.
Formulář se otevře.
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
V nabídce Soubor přejděte na Přidat a klikněte na Nový projekt.
V dialogovém okně Přidat nový projekt klikněte na Windows a potom klikněte na Knihovna tříd.
Do pole Název zadejte NGenCustomAction a pak klikněme na tlačítko OK.
V nabídce Project (Projekt) klepněte na příkaz Add New Item (Přidat novou položku).
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í.
V okně Průzkumník řešení v projektu NGenCustomAction odstraňte soubor kódu Class1.
Přidání kódu do vlastní akce
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;
Aktualizujte deklaraci třídy tak, aby dědila ze třídy System.Configuration.Install.Installer.
Inherits System.Configuration.Install.Installer
: System.Configuration.Install.Installer
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); } } }
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
V nabídce Soubor přejděte na Přidat a klikněte na Nový projekt.
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.
Do pole Název zadejte Browser Sample Installer a pak klikněte na tlačítko OK.
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.
V rozevíracím seznamu Projekt vyberte BrowserSample, klikněte na Výstup projektu a potom klikněte na tlačítko OK.
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.
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
V okně Průzkumník řešení klikněte na projekt Browser Sample Installer.
V nabídce Zobrazení přejděte na Editor a potom klikněte na Vlastní akce.
V okně Editor vlastních akcí vyberte uzel Vlastní akce.
V nabídce Akce klikněte na Přidat vlastní akci.
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.
V uzlu Install klikněte na Primární výstup z NGenCustomAction (aktivní).
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.
V okně Průzkumník řešení klikněte na projekt instalaceBrowser Sample Installer.
V nabídce Sestavení klikněte na Sestavit Browser Sample Installer.
Ověření generování nativního kódu
Přejděte do instalační složky a najděte soubor BrowserSample.exe. Například %PROGRAMFILES%\CompanyName\Brower Sample Installer\BrowserSample.exe..
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
Ngen.exe (Native Image Generator)