加快使用 Ngen.exe 安装的程序的启动速度

页面创建日期 :

环境

Visual Studio
  • Visual Studio Community 2017
  • Visual Studio Community 2019
WiX Toolset
3.11.2

* 它适用于其他版本,但尚未确认

入门

.NET 框架应用程序使用 Ngen.exe 创建和安装本机映像。 您可以加快启动和运行速度。

但是,若要创建本机映像,必须在运行应用程序的环境中使用 Ngen.exe 不能分发预先映像的内容。 因此,您是否希望用户手动运行 Ngen.exe? 必须在安装过程中运行。

本节介绍在安装过程中在 WiX 设置中对目标 exe 或 dll 执行 Ngen.exe 的过程。

请注意,Ngen.exe 仅对 .NET 框架应用程序有效,并且最初是本机程序集。 这对于 .NET 核心应用程序没有意义。

提前准备

  • 假定您已经在 WiX 中创建了安装程序。

添加库引用

将"WixNetFx 扩展.dll 添加到引用。 文件夹路径为"C:\程序文件 (x86)\WiX 工具集 v3.11_bin"。

image

image

image

编辑产品.wxs

为运行 Ngen.exe 的文件添加设置。

Wix/@xmlns

添加 NetFx 扩展命名空间。

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
		 xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">

将参数添加到创建本机映像的组件(文件)

将 netfx:本机映像添加到目标文件的子元素。

<Component Win64="yes" Id="OGGVORBISPROJECT.DLL" DiskId="1" Guid="6A1D2FD8-9FA7-40D5-A0EA-356268B3C0B4">
  <File Id="OGGVORBISPROJECT.DLL" Name="OggVorbisProject.dll" Source="LittleSaviorTrial\Dll\OggVorbisProject.dll">
    <netfx:NativeImage Id="NGEN_OGGVORBISPROJECT.DLL" Platform="64bit" Priority="0"/>
  </File>
</Component>

如果 exe 或 dll 由于 Ngen.exe 的性质而引用(依赖)其他 dll,则只需指定引用的 exe 或 dll 即可。 例如,如果 A.exe 引用 B.dll,则仅将本机映像设置为 A .exe将自动包括 B.dll。

但是,如果 A.exe 在执行后使用程序集.load 等动态加载 B.dll,则 B.dll 不是依赖项。 在 A.exe 中使用 Ngen.exe 不会编译 B.dll。 在这种情况下,您将在 B.dll 中设置本机映像。

@Id

本机映像的可分辨名称。 不要与其他 Id 重叠。

@Platform

指定"32 位"、"64 位"或"全部"。 更改要安装的应用程序的 32 位或 64 位设置。 all 会创建两个本机映像,因此请指定根据执行状态(如"任意 CPU")切换的库。

@Priority

安装时何时运行 Ngen.exe。 您可以指定 0 到 3,但有关详细信息,请参阅官方网站。

总结

创建安装程序后,可以验证安装是否成功,是否已创建本机映像并将其注册到程序集文件夹中。

image