Compartilhar via


Walkthrough: Usando uma ação Personalizar para compilar um binário para nativo Código na instalação

Você pode definir as ações personalizadas para especificar os comandos que são executados após uma instalação. Por exemplo, nesta explicação, você definir uma ação personalizada e passar o nome de caminho de um EXE para o CustomActionData propriedade para compilar o executável para código nativo, depois que o aplicativo está instalado.

ObservaçãoObservação

Seu computador pode mostrar nomes ou locais diferentes para alguns dos elementos da interface do usuário do Visual Studio nas instruções a seguir. A edição do Visual Studio que você possui e as configurações que você usa determinam esses elementos. Para obter mais informações, consulte Configurações do Visual Studio.

Para criar um aplicativo de navegador da Web para implantar

  1. No menu File, aponte para New, e em seguida, clique em Project.

  2. Clique em Windows Forms Application.

  3. Para o nome, digite BrowserSample e clique em OK.

  4. No menu Exibir, clique em Caixa de Ferramentas.

  5. Expanda Todos os formulários do Windowse arraste um painel o controle para a parte superior esquerda do formulário.

  6. No Designer de formulário, arraste um TextBox controle e botão o controle para o painel controle.

  7. No Designer de formulário, arraste um WebBrowser abaixo do controle de painel.

  8. Expanda o tamanho do formulário para ajustar todos os controles.

  9. No Designer de formulário, clique na painel controle.

  10. No Propriedades janela, alterar o Dock propriedade em um Layout para superior.

  11. No Designer de formulário, clique na WebBrowser controle.

  12. No Propriedades janela, alterar o Dock propriedade em um Layout para preencher.

  13. No Designer de formulário, clique na botão controle.

  14. No Propriedades janela, alterar o texto propriedade em aparência para ir.

  15. Redimensionar o formulário, painel, caixa de texto, botão, e WebBrowser suas preferências.

  16. No Designer de formulário, clique duas vezes o Ir botão.

    O modo de exibição de código para o arquivo de código de Form1 é exibida.

  17. Adicione o seguinte código adiciona funcionalidade ao seu aplicativo de navegação na Web. O texto a TextBox controle é a barra de endereços para o WebBrowser controle e a ação ocorre quando você clica na Ir botão.

    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. Para testar o navegador, pressione F5.

    O formulário é aberto.

  19. Na caixa de texto, digite https://www.microsoft.com e clique em Ir.

    O site da Microsoft é exibida.

Para criar a classe da ação personalizada

  1. Sobre o arquivo , aponte para Adde, em seguida, clique em Novo projeto.

  2. No Add New Project caixa de diálogo, clique em Windowse, em seguida, clique em Biblioteca de classe.

  3. No nome , digite NGenCustomActione em seguida, clique em OK.

  4. No menu Project, clique em Add New Item.

  5. No Add New Item caixa de diálogo, clique em Gerale, em seguida, clique em A classe de instalador. No nome , digite NGenCustomActione em seguida, clique em Add.

    ObservaçãoObservação

    Certifique-se de que você adicione um A classe de instalador; Caso contrário, o arquivo de código não terá necessário using instruções.

  6. Em Solution Explorer, exclua o Class1 o arquivo de código no projeto NGenCustomAction.

Para adicionar código para a ação personalizada

  1. Botão direito do mouse o arquivo de código de NGenCustomAction em Solution Explorer (ou a superfície de design) e, em seguida, clique em Exibir código para abrir o Editor de código. Adicione o seguinte código na parte superior do módulo.

    Imports System.IO
    Imports System.Diagnostics
    
    using System.IO;
    using System.Diagnostics;
    
  2. Atualizar a declaração de classe para herdar de System.Configuration.Install.Installer classe.

    Inherits System.Configuration.Install.Installer
    
    : System.Configuration.Install.Installer
    
  3. No arquivo de código NGenCustomAction, adicione o seguinte método auxiliar para gerar o arquivo de código de imagem nativa para qualquer 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);
                    }
                }
            }
    
    
  4. No arquivo de código NGenCustomAction, adicione o seguinte procedimento para substituir o Install, Commit, Rollback, e Uninstall os procedimentos da classe de 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");
    }
    

Para adicionar um projeto de implantação do aplicativo de amostra do navegador

  1. Sobre o arquivo , aponte para Adde, em seguida, clique em Novo projeto.

  2. No Add New Project diálogo caixa, expanda Other Project Types, expanda Setup and Deployment Projects, clique em Visual Studio Installer dee, em seguida, clique em Setup Project.

  3. No nome , digite Installer de amostra do navegadore em seguida, clique em OK.

  4. No File System Editor, selecione o A pasta de aplicativo. Sobre o ação menu, clique em Add.

    A caixa de diálogo Add Project Output Group aparece.

  5. Na caixa de combinação drop-down de projeto, selecione BrowserSample, clique em A saída de projetoe em seguida, clique em OK.

  6. No File System Editor, selecione o A pasta de aplicativo. Sobre o ação menu, clique em Add.

    A caixa de diálogo Add Project Output Group aparece.

  7. Na caixa de combinação drop-down de projeto, selecione NGenCustomAction, clique em A saída de projetoe em seguida, clique em OK.

Para adicionar a ação personalizada do NGEN ao projeto de instalação

  1. Em Solution Explorer, clique na Installer de amostra do navegador projeto.

  2. Sobre o Exibir , aponte para Editore, em seguida, clique em Custom Actions.

  3. No Custom Actions Editor, selecione o Custom Actions nó.

  4. Sobre o ação menu, clique em Add Custom Action.

  5. No Select Item in Project caixa de diálogo, clique duas vezes o A pasta de aplicativo, clique em **saída primária do NGenCustomAction (ativo)**e, em seguida, clique em OK

    A ação personalizada do NGen é adicionada a todos os quatro nós de ação personalizada.

  6. No instalar o nó, clique em saída primária do NGenCustomAction (ativo).

  7. No Propriedades janela, alterar o CustomActionData propriedade para /Args="[TARGETDIR]BrowserSample.exe". Inclua as aspas.

    ObservaçãoObservação

    A propriedade [TARGETDIR] é o local do executável instalado. A ação personalizada usa o NGen. exe para converter o executável instalado em uma imagem nativa.

  8. Em Solution Explorer, clique o Installer de amostra do navegador o projeto de instalação.

  9. No Build menu, clique em Criar instalador de amostra do navegador.

Para verificar a geração de código nativo

  1. Navegue até a pasta de instalação e localizar o arquivo BrowserSample.exe. Por exemplo %PROGRAMFILES%\CompanyName\Brower Installer\BrowserSample.exe de amostra.

  2. No prompt de comando Visual Studio, verifique que o executável foi pré-compilado para código nativo, executando o código a seguir:

    ngen.exe display FullPathToExe
    

    Por exemplo, você pode executar o comando a seguir:

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

    A saída do comando aparece.

    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>
    
    ObservaçãoObservação

    Se o NGen. exe não exibir uma imagem nativa, você pode encontrar que o ngen registra em um dos seguintes diretórios:

    %SystemRoot%\Microsoft.NET\Framework\v < versão CLR > %SystemRoot%\Microsoft.NET\Framework64\v < versão CLR >

    O arquivo ngen.log é o log de solução de problemas mais recente.

Consulte também

Referência

Propriedade CustomActionData

NGen (Native Image Generator)

Conceitos

Processo de Execução Gerenciada

Outros recursos

Personalizar Gerenciamento de ações na implantação