Поделиться через


Пошаговое руководство. Использование настраиваемого действия для компиляции двоичного файла в машинный код при установке

Разработчик может определить настраиваемые действия, которые выполняются после установки. В данном руководстве определяется настраиваемое действие, а путь к EXE-файлу передается в свойстве CustomActionData, что позволяет выполнить предварительную компиляцию сборки в машинный код после установки приложения.

Примечание

На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.

Создание приложения веб-браузера для развертывания

  1. В меню Файл последовательно выберите пункты Создать и Проект.

  2. Щелкните элемент Приложение Windows Forms.

  3. В поле Имя введите BrowserSample, а затем нажмите кнопку OK.

  4. В меню Вид выберите пункт Панель элементов.

  5. Разверните элемент Все формы Windows Forms и перетащите элемент управления Panel в левый верхний угол формы.

  6. Откройте конструктор форм и перетащите элементы управления TextBox и Button на элемент управления Panel.

  7. Перетащите элемент управления WebBrowser под элемент управления Panel в конструкторе.

  8. Увеличьте размер формы для размещения всех элементов управления.

  9. В конструкторе форм щелкните элемент управления Panel.

  10. В окне свойств замените значение свойства Dock в разделе "Структура" на значение Top.

  11. В конструкторе форм щелкните элемент управления WebBrowser.

  12. В окне свойств замените значение свойства Dock в разделе "Структура" на значение Fill.

  13. В конструкторе форм щелкните элемент управления Button.

  14. В окне свойств замените значение свойства Text в разделе "Внешний вид" на значение Go.

  15. При необходимости измените размер элементов управления Form, Panel, Textbox, Button и WebBrowser.

  16. В конструкторе форм дважды щелкните кнопку Go.

    Отобразится представление кода для файла Form1.

  17. Добавьте следующий код, обеспечивающий возможность просмотра веб-страниц в приложении. Текст в элементе управления TextBox является строкой адреса для элемента WebBrowser, а переход выполняется после нажатия кнопки Go.

    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. Чтобы протестировать браузер, нажмите клавишу F5.

    Отобразится форма.

  19. Введите адрес https://www.microsoft.com в текстовое поле, а затем нажмите кнопку Go.

    Откроется веб-сайт корпорации Майкрософт.

Чтобы создать класс настраиваемого действия

  1. В меню Файл выберите команду Добавить, затем выберите пункт Создать проект.

  2. В диалоговом окне Добавление нового проекта щелкните элемент Windows, а затем — элемент Библиотека классов.

  3. В поле Имя введите NGenCustomAction и нажмите кнопку ОК.

  4. В меню Проект выберите команду Добавить новый элемент.

  5. В диалоговом окне Добавление нового элемента щелкните элемент Общие и выберите элемент Класс установщика. В поле Имя введите NGenCustomAction и нажмите кнопку Добавить.

    Примечание

    Обязательно добавьте Класс установщика; в противном случае в файле кода не будут присутствовать необходимые операторы using.

  6. Откройте обозреватель решений и удалите файл кода Class1 из проекта NGenCustomAction.

Чтобы добавить код к настраиваемому действию

  1. Щелкните файл кода NGenCustomAction правой кнопкой мыши в обозревателе решений (или в области конструктора), а затем выберите команду Просмотреть код, чтобы открыть Редактор кода. Добавьте следующий код в начало модуля.

    Imports System.IO
    Imports System.Diagnostics
    
    using System.IO;
    using System.Diagnostics;
    
  2. Добавьте в объявление класса наследование от класса System.Configuration.Install.Installer.

    Inherits System.Configuration.Install.Installer
    
    : System.Configuration.Install.Installer
    
  3. Добавьте следующий вспомогательный метод в файл кода NGenCustomAction, чтобы создать встроенный файл кода образа для любой сборки.

        <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. Добавьте следующую процедуру в файл NGenCustomAction, чтобы переопределить процедуры базового класса Install, Commit, Rollback и Uninstall.

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

Добавление проекта развертывания для образца веб-браузера

  1. В меню Файл выберите команду Добавить, затем выберите пункт Создать проект.

  2. В области Другие типы проектов диалогового окна Добавление нового проекта разверните узел Проекты установки и развертывания, щелкните элемент Установщик Visual Studio, а затем выберите пункт Проект установки.

  3. В поле Имя введите Browser Sample Installer и нажмите кнопку ОК.

  4. В Редакторе файловой системы выберите узел Папка приложения. В меню Действие выберите команду Добавить.

    Отобразится диалоговое окно "Добавление выходной группы проекта".

  5. В раскрывающемся списке "Проект" выберите элемент BrowserSample, щелкните элемент Выходные данные проекта, а затем нажмите кнопку ОК.

  6. В Редакторе файловой системы выберите узел Папка приложения. В меню Действие выберите команду Добавить.

    Отобразится диалоговое окно "Добавление выходной группы проекта".

  7. В раскрывающемся списке "Проект" выберите элемент NGenCustomAction, щелкните элемент Выходные данные проекта, а затем нажмите кнопку ОК.

Добавление настраиваемого действия NGEN в проект установки

  1. В обозревателе решений щелкните проект Browser Sample Installer.

  2. В меню Вид выберите пункт Редактор, а затем пункт Настраиваемые действия.

  3. В Редакторе настраиваемых действий выберите узел Настраиваемые действия.

  4. В меню Действие выберите пункт Добавить настраиваемое действие.

  5. В диалоговом окне Выбор элемента в проекте дважды щелкните строку Папка приложения, выберите элемент Основной выходной файл проекта NGenCustomAction (Active) и нажмите кнопку ОК.

    Настраиваемое действие NGen будет добавлено ко всем четырем узлам настраиваемых действий.

  6. Выберите элемент Основной выходной файл проекта NGenCustomAction (Active) в узле Установка.

  7. В окне Свойства измените значение свойства CustomActionData на /Args="[TARGETDIR]BrowserSample.exe". Необходимо указывать кавычки.

    Примечание

    Свойство [TARGETDIR] представляет собой расположение установленного исполняемого файла.Настраиваемое действие использует файл ngen.exe для преобразования установленного исполняемого файла во встроенный образ.

  8. В обозревателе решений щелкните проект установки Browser Sample Installer.

  9. В меню Построение выберите пункт Построить Browser Sample Installer.

Проверка создания машинного кода

  1. Перейдите в папку установки и найдите файл BrowserSample.exe. Например, он может располагаться в папке %PROGRAMFILES%\CompanyName\Brower Sample Installer\BrowserSample.exe.

  2. Откройте командную строку Visual Studio и убедитесь в том, что файл был предварительно скомпилирован в машинный код, выполнив следующую команду:

    ngen.exe display FullPathToExe
    

    Например, можно выполнить следующую команду:

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

    Будут выведены следующие данные.

    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>
    

    Примечание

    Если файл ngen.exe не отображает образ в машинном коде, в одной из следующих папок можно просмотреть файлы журнала ngen:

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

    Файл журнала ngen.log — это журнал устранения неполадок с самыми последними сведениями.

См. также

Ссылки

Свойство CustomActionData

Ngen.exe (генератор образов в машинном коде)

Основные понятия

Процесс управляемого выполнения

Другие ресурсы

Управление настраиваемыми действиями при развертывании