.NET Frameworkのngen.exe

.NET Frameworkを使用して開発をしていると処理速度が遅くなってしまう時がある。それも決まって1回目の処理時だけ。
原因を調べてみると、以下の記事を発見。
Visual Basic .NETは遅いのか!? - @IT
ようは、ソースコードから生成されたexeファイル(MSILコード)から実行環境の.NET FrameworkJITコンパイラーでコンパイルしてネイティブコードを生成するまでに、待ち時間が発生しているため、らしい。
それを解決するためには、.NET Frameworkに付属しているngen.exeというツールを使って先にネイティブイメージを生成してキャッシュにインストールしておけばOKとのこと。
Ngen.exe (ネイティブ イメージ ジェネレーター) | Microsoft Docs


使い方は簡単。コマンドプロンプトから対象プログラムの.NET Frameworkのバージョンに合わせたngen.exeを実行してやればいいだけ。
ネイティブイメージを生成してインストールする場合はこんな感じのコマンドを叩く(下記の場合.NET Framework 4.0*1 *2 )。

C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe install C:\Users\WK6\Hoge.exe

プログラムを移動する、あるいは上書きすると効果が無くなってしまうため注意。
なお、Vista以降のOSでProgram Filesなどに配置してあるプログラムの場合は、コマンドプロンプトを管理者権限で実行してからでないとうまくいきません。
ちなみにコマンドプロンプトを起動する際、Visual Studioコマンドプロンプトから実行すれば、絶対パスでngen.exeを指定する必要はなくなります*3


インストーラーで配布する場合など、コマンドプロンプトからコマンドを叩くことができない時は、後処理用のバッチファイルなどを用意してあとで動作させるか、もしくは.NET Frameworkインストーラーにカスタム動作を追加する。
方法は、以下のMSDNに書いてある手順(「カスタム動作クラスを作成するには」から)をほぼそのまま真似するだけでOK。
Download Visual Studio 2003 Retired Technical documentation from Official Microsoft Download Center


スペック低めのPCでソフトを動作させる必要がある時にはこの処理が有効なこともあるため、処理速度が問題になるようであれば試してみるのも手かも。

*1:.NET Frameworkのバージョンごとにngen.exeは用意されてます。2.0ならv2.0.50727 というフォルダ名。

*2:.NET Framework 1.0と1.1では記法や機能が違うらしい。 ネイティブ イメージ ジェネレーター (Ngen.exe) のレガシ構文 | Microsoft Docs

*3:ただこの場合、デフォルトでは最新の.NET Frameworkのngen.exeを使用するっぽいので、.NET Frameworkのバージョンが指定されている場合はちゃんとパスを指定した方がいいかも。