Пошаговое руководство. Использование настраиваемого действия для компиляции двоичного файла в машинный код при установке
Разработчик может определить настраиваемые действия, которые выполняются после установки. В данном руководстве определяется настраиваемое действие, а путь к EXE-файлу передается в свойстве CustomActionData, что позволяет выполнить предварительную компиляцию сборки в машинный код после установки приложения.
Примечание
На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.
Создание приложения веб-браузера для развертывания
В меню Файл последовательно выберите пункты Создать и Проект.
Щелкните элемент Приложение Windows Forms.
В поле Имя введите BrowserSample, а затем нажмите кнопку OK.
В меню Вид выберите пункт Панель элементов.
Разверните элемент Все формы Windows Forms и перетащите элемент управления Panel в левый верхний угол формы.
Откройте конструктор форм и перетащите элементы управления TextBox и Button на элемент управления Panel.
Перетащите элемент управления WebBrowser под элемент управления Panel в конструкторе.
Увеличьте размер формы для размещения всех элементов управления.
В конструкторе форм щелкните элемент управления Panel.
В окне свойств замените значение свойства Dock в разделе "Структура" на значение Top.
В конструкторе форм щелкните элемент управления WebBrowser.
В окне свойств замените значение свойства Dock в разделе "Структура" на значение Fill.
В конструкторе форм щелкните элемент управления Button.
В окне свойств замените значение свойства Text в разделе "Внешний вид" на значение Go.
При необходимости измените размер элементов управления Form, Panel, Textbox, Button и WebBrowser.
В конструкторе форм дважды щелкните кнопку Go.
Отобразится представление кода для файла Form1.
Добавьте следующий код, обеспечивающий возможность просмотра веб-страниц в приложении. Текст в элементе управления 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); }
Чтобы протестировать браузер, нажмите клавишу F5.
Отобразится форма.
Введите адрес https://www.microsoft.com в текстовое поле, а затем нажмите кнопку Go.
Откроется веб-сайт корпорации Майкрософт.
Чтобы создать класс настраиваемого действия
В меню Файл выберите команду Добавить, затем выберите пункт Создать проект.
В диалоговом окне Добавление нового проекта щелкните элемент Windows, а затем — элемент Библиотека классов.
В поле Имя введите NGenCustomAction и нажмите кнопку ОК.
В меню Проект выберите команду Добавить новый элемент.
В диалоговом окне Добавление нового элемента щелкните элемент Общие и выберите элемент Класс установщика. В поле Имя введите NGenCustomAction и нажмите кнопку Добавить.
Примечание
Обязательно добавьте Класс установщика; в противном случае в файле кода не будут присутствовать необходимые операторы using.
Откройте обозреватель решений и удалите файл кода Class1 из проекта NGenCustomAction.
Чтобы добавить код к настраиваемому действию
Щелкните файл кода NGenCustomAction правой кнопкой мыши в обозревателе решений (или в области конструктора), а затем выберите команду Просмотреть код, чтобы открыть Редактор кода. Добавьте следующий код в начало модуля.
Imports System.IO Imports System.Diagnostics
using System.IO; using System.Diagnostics;
Добавьте в объявление класса наследование от класса System.Configuration.Install.Installer.
Inherits System.Configuration.Install.Installer
: System.Configuration.Install.Installer
Добавьте следующий вспомогательный метод в файл кода 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); } } }
Добавьте следующую процедуру в файл 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"); }
Добавление проекта развертывания для образца веб-браузера
В меню Файл выберите команду Добавить, затем выберите пункт Создать проект.
В области Другие типы проектов диалогового окна Добавление нового проекта разверните узел Проекты установки и развертывания, щелкните элемент Установщик Visual Studio, а затем выберите пункт Проект установки.
В поле Имя введите Browser Sample Installer и нажмите кнопку ОК.
В Редакторе файловой системы выберите узел Папка приложения. В меню Действие выберите команду Добавить.
Отобразится диалоговое окно "Добавление выходной группы проекта".
В раскрывающемся списке "Проект" выберите элемент BrowserSample, щелкните элемент Выходные данные проекта, а затем нажмите кнопку ОК.
В Редакторе файловой системы выберите узел Папка приложения. В меню Действие выберите команду Добавить.
Отобразится диалоговое окно "Добавление выходной группы проекта".
В раскрывающемся списке "Проект" выберите элемент NGenCustomAction, щелкните элемент Выходные данные проекта, а затем нажмите кнопку ОК.
Добавление настраиваемого действия NGEN в проект установки
В обозревателе решений щелкните проект Browser Sample Installer.
В меню Вид выберите пункт Редактор, а затем пункт Настраиваемые действия.
В Редакторе настраиваемых действий выберите узел Настраиваемые действия.
В меню Действие выберите пункт Добавить настраиваемое действие.
В диалоговом окне Выбор элемента в проекте дважды щелкните строку Папка приложения, выберите элемент Основной выходной файл проекта NGenCustomAction (Active) и нажмите кнопку ОК.
Настраиваемое действие NGen будет добавлено ко всем четырем узлам настраиваемых действий.
Выберите элемент Основной выходной файл проекта NGenCustomAction (Active) в узле Установка.
В окне Свойства измените значение свойства CustomActionData на /Args="[TARGETDIR]BrowserSample.exe". Необходимо указывать кавычки.
Примечание
Свойство [TARGETDIR] представляет собой расположение установленного исполняемого файла.Настраиваемое действие использует файл ngen.exe для преобразования установленного исполняемого файла во встроенный образ.
В обозревателе решений щелкните проект установки Browser Sample Installer.
В меню Построение выберите пункт Построить Browser Sample Installer.
Проверка создания машинного кода
Перейдите в папку установки и найдите файл BrowserSample.exe. Например, он может располагаться в папке %PROGRAMFILES%\CompanyName\Brower Sample Installer\BrowserSample.exe.
Откройте командную строку 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 — это журнал устранения неполадок с самыми последними сведениями.
См. также
Ссылки
Ngen.exe (генератор образов в машинном коде)
Основные понятия
Процесс управляемого выполнения