Procedura dettagliata: utilizzo di un'azione personalizzata per la compilazione di un file binario in codice nativo in fase di installazione
È possibile definire azioni personalizzate per specificare comandi che vengono eseguiti dopo un'installazione. Ad esempio, in questa procedura dettagliata si definisce un'azione personalizzata e si passa il nome del percorso di un file EXE alla proprietà CustomActionData per compilare il file eseguibile in codice nativo dopo l'installazione dell'applicazione.
Nota
Nel computer in uso è possibile che vengano visualizzati nomi o percorsi diversi per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. La versione di Visual Studio in uso e le impostazioni configurate determinano questi elementi. Per ulteriori informazioni vedere Impostazioni di Visual Studio.
Per creare un'applicazione Web browser da distribuire
Scegliere Nuovo dal menu File, quindi fare clic su Progetto.
Fare clic su Applicazione Windows Form.
In Nome digitare BrowserSample, quindi fare clic su OK.
Scegliere Casella degli strumenti dal menu Visualizza.
Espandere Tutti i Windows Form e trascinare un controllo Panel in alto a sinistra nel form.
Nella finestra di progettazione del form trascinare un controllo TextBox e un controllo Button nel controllo Panel.
Nella finestra di progettazione del form trascinare un controllo WebBrowser sotto Panel.
Espandere le dimensioni del form in modo che possa contenere tutti i controlli.
Nella finestra di progettazione del form fare clic sul controllo Panel.
Nella Finestra Proprietà impostare la proprietà Dock in Layout su Top.
Nella finestra di progettazione del form fare clic sul controllo WebBrowser.
Nella Finestra Proprietà impostare la proprietà Dock in Layout su Fill.
Nella finestra di progettazione del form fare clic sul controllo Button.
Nella Finestra Proprietà impostare la proprietà Text in Aspetto su Vai.
Ridimensionare i controlli Form, Panel, Textbox, Button e WebBrowser nel modo desiderato.
Nella finestra di progettazione del form fare doppio clic sul pulsante Vai.
Verrà visualizzato il codice per il file di codice Form1.
Aggiungere il codice seguente, che aggiunge funzionalità di esplorazione Web all'applicazione. Il testo nel controllo TextBox è la barra degli indirizzi per il controllo WebBrowser e l'azione si verifica quando si fa clic sul pulsante Vai.
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); }
Per testare il browser, premere F5.
Verrà aperto il form.
Nella casella di testo digitare https://www.microsoft.com, quindi fare clic su Vai.
Verrà visualizzato il sito Web Microsoft.
Per creare la classe di un'azione personalizzata
Scegliere Aggiungi dal menu File, quindi fare clic su Nuovo progetto.
Nella finestra di dialogo Aggiungi nuovo progetto fare clic su Windows, quindi scegliere Libreria di classi.
Nella casella Nome digitare NGenCustomAction e quindi fare clic su OK.
Scegliere Aggiungi nuovo elemento dal menu Progetto.
Nella finestra di dialogo Aggiungi nuovo elemento fare clic su Generale, quindi su Classe Installer. Nella casella Nome digitare NGenCustomAction e quindi fare clic su Aggiungi.
Nota
Accertarsi di aggiungere una classe Installer. In caso contrario, il file di codice non disporrà delle istruzioni using necessarie.
In Esplora soluzioni eliminare il file di codice Class1 nel progetto NGenCustomAction.
Per aggiungere codice all'azione personalizzata
Fare clic con il pulsante destro del mouse sul file di codice NGenCustomAction in Esplora soluzioni (o sull'area di progettazione), quindi scegliere Visualizza codice per aprire l'editor del codice. Aggiungere il codice seguente all'inizio del modulo.
Imports System.IO Imports System.Diagnostics
using System.IO; using System.Diagnostics;
Aggiornare la dichiarazione della classe in modo che erediti dalla classe System.Configuration.Install.Installer.
Inherits System.Configuration.Install.Installer
: System.Configuration.Install.Installer
Nel file di codice NGenCustomAction aggiungere il metodo di supporto seguente per generare il file di codice dell'immagine nativa per qualsiasi assembly.
<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); } } }
Nel file di codice NGenCustomAction aggiungere la procedura seguente per eseguire l'override delle procedure Install, Commit, Rollback e Uninstall della classe base.
<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"); }
Per aggiungere un progetto di distribuzione per l'applicazione browser di esempio
Scegliere Aggiungi dal menu File, quindi fare clic su Nuovo progetto.
Nella finestra di dialogo Aggiungi nuovo progetto espandere Altri tipi di progetto, espandere Progetti di installazione e distribuzione, fare clic su Programma di installazione di Visual Studio e quindi su Progetto di installazione.
Nella casella Nome digitare Browser Sample Installer, quindi fare clic su OK.
Nell'Editor del file system selezionare Cartella Applicazione. Scegliere Aggiungi dal menu Azione.
Verrà visualizzata la finestra di dialogo Aggiungi gruppo output progetto.
Nella casella combinata a discesa Progetto selezionare BrowserSample, fare clic su Output progetto, quindi su OK.
Nell'Editor del file system selezionare Cartella Applicazione. Scegliere Aggiungi dal menu Azione.
Verrà visualizzata la finestra di dialogo Aggiungi gruppo output progetto.
Nella casella combinata a discesa Progetto selezionare NGenCustomAction, fare clic su Output progetto, quindi su OK.
Per aggiungere l'azione personalizzata NGEN al progetto di installazione
In Esplora soluzioni fare clic sul progetto Browser Sample Installer.
Scegliere Editor dal menu Visualizza, quindi Azioni personalizzate.
Nell'Editor delle azioni personalizzate selezionare il nodo Azioni personalizzate.
Scegliere Aggiungi azione personalizzata dal menu Azione.
Nella finestra di dialogo Seleziona elemento nel progetto fare doppio clic su Cartella Applicazione, scegliere Output primario da NGenCustomAction (Attivo), quindi scegliere OK
L'azione personalizzata NGen verrà aggiunta ai quattro nodi dell'azione personalizzata.
Nel nodo Installa fare clic su Output primario da NGenCustomAction (Attivo).
Nella finestra Proprietà modificare la proprietà CustomActionData in /Args="[TARGETDIR]BrowserSample.exe". Includere le virgolette doppie.
Nota
La proprietà [TARGETDIR] è il percorso del file eseguibile installato. L'azione personalizzata utilizza ngen.exe per convertire il file eseguibile installato in un'immagine nativa.
In Esplora soluzioni fare clic sul progetto di installazione Browser Sample Installer.
Scegliere Compila Browser Sample Installer dal menu Compila.
Per verificare la generazione del codice nativo
Passare alla cartella di installazione e trovare il file BrowserSample.exe. Ad esempio %PROGRAMMI%\NomeSocietà\Browser Installer\BrowserSample.exe.
In un prompt dei comandi di Visual Studio verificare che il file eseguibile sia stato precompilato nel codice nativo eseguendo il codice seguente:
ngen.exe display FullPathToExe
Ad esempio, eseguire il comando seguente:
ngen.exe display "C:\Program Files (x86)\Microsoft\Browser Sample Installer\BrowserSample.exe"
Verrà visualizzato l'output del comando.
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>
Nota
Se ngen.exe non visualizza un'immagine nativa, è possibile trovare i log ngen in una delle directory seguenti:
%SystemRoot%\Microsoft.NET\Framework\v<CLR version> %SystemRoot%\Microsoft.NET\Framework64\v<CLR version>
Il file ngen.log è il log più recente della risoluzione dei problemi.
Vedere anche
Riferimenti
Ngen.exe (generatore di immagini native)
Concetti
Processo di esecuzione gestita
Altre risorse
Gestione delle azioni personalizzate durante la distribuzione