Ngen.exe を使用してインストールしたプログラムの起動を高速化
環境
- Visual Studio
-
- Visual Studio Community 2017
- Visual Studio Community 2019
- WiX Toolset
- 3.11.2
※他のバージョンでも動作しますが未確認です
はじめに
.NET Framework アプリケーションは Ngen.exe を使用することによってネイティブイメージを作成しインストールを行い、 起動や実行速度を高速化させることができます。
しかし、ネイティブイメージを作成するためにはアプリケーションを実行する環境で Ngen.exe を使用する必要があり 前もってイメージ化したものを配布することはできません。そのため、Ngen.exe をユーザーに手動で実行してもらうか インストール時に実行する必要があります。
ここでは WiX の設定で対象の exe または dll に対してインストール時に Ngen.exe を実行するための手順について説明しています。
なお、Ngen.exe は .NET Framework アプリケーションに対してのみ有効であり、もともとネイティブアセンブリであったり .NET Core アプリケーションに対しては使う意味はありません。
事前準備
- WiX でのインストーラー作成が出来ているものとします。
ライブラリ参照の追加
WixNetFxExtension.dll を参照に追加します。フォルダパスは「C:\Program Files (x86)\WiX Toolset v3.11\bin」です。
Product.wxs の編集
Ngen.exe を実行するファイルに対して設定を追加していきます。
Wix/@xmlns
NetFxExtension の名前空間を追加します。
<?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:NativeImage を追加します。
<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>
Ngen.exe の性質で exe や dll が他の dll を参照(依存)している場合は参照元の exe や dll のみを指定すれば OK です。 例えば A.exe が B.dll を参照している場合は A.exe のみに NativeImage の設定を行うと B.dll も自動的に対象となります。
ただし、A.exe が実行後に動的に Assembly.Load などを使用して B.dll を読み込む形の場合、B.dll は依存関係ではないので A.exe に Ngen.exe を使用しても B.dll はコンパイルされません。この場合は B.dll にも NativeImage の設定を行います。
@Id
ネイティブイメージの識別名です。他の Id と重ならないようにしてください。
@Platform
「32bit」「64bit」「all」のいずれかを指定します。 インストールするアプリケーションが 32bit か 64bit かで設定を変更してください。 all にすると両方のネイティブイメージが作成されますので、「Any CPU」のような実行状態に応じて切り替わるライブラリなどに指定します。
@Priority
インストール時に Ngen.exe を実行するタイミングです。0~3 を指定できますが、詳しくは公式サイトを参照してください。
まとめ
インストーラーを作成後、インストールに成功するとネイティブイメージが作成され assembly フォルダに登録されていることが確認できます。