プリコンパイルの概要とaspnet_compilerコマンド

プリコンパイル方式

以下ふたつのプリコンパイル方式がある。

埋め込み先プリコンパイル

英語では In-Place Precompilation と言い、直訳すれば、その場でのプリコンパイルである。
埋め込み先プリコンパイルを行う際、サイトは、ソースファイルと共にWEBサーバーにデプロイしておく。通常のコンパイルは、ページに対して初回のアクセス時に実行されるが、埋め込み先プリコンパイルは、事前に全てのページにアクセスすることで、全てのページをコンパイルされた状態にする。

配置用プリコンパイル

英語では Precompilation for Deployment と言い、直訳すれば、デプロイのためのプリコンパイルである。このプリコンパイルは、デプロイ用のファイル一式を生成する。生成されたファイル一式にはソースファイルは含まれない。このファイル一式は後にWEBサーバーにデプロイする。
配置用プリコンパイルには更に次のふたつの形式がある。

・更新できないプリコンパイル(Precompiling for Deployment Only)
・更新可能なプリコンパイル(Precompiling for Deployment and Update)

更新できないプリコンパイルは、何かしらの変更(web.configを除く)を行う場合、常に再コンパイルが必要になる。更新可能なプリコンパイルは、デプロイ済みのaspxファイルを修正し、コントロールの位置やフォントなどを一部の変更を再コンパイルなしで実施できる。更新可能なプリコンパイルでは、ページがユーザにリクエストされた際、IISによって追加のコンパイル処理が行われる。

aspnet_compilerのコマンド形式

aspnet_compilerは、コマンドオプションの指定方法、vオプションの解釈のされ方が、埋め込み先プリコンパイルと配置用プリコンパイルでは異なる。aspnet_compilerは、ターゲットパスを指定した場合には、配置用プリコンパイルを行う。以下、それぞれの典型的なコマンドを示す。

埋め込み先プリコンパイル用のaspnet_compilerコマンド形式

aspnet_compiler -v {appname}

または、

aspnet_compiler -v LM/W3SVC/{siteid}/Root/{appname}

LM/W3SVC/{siteid}/Root/{appname} は、メタベースパス(metabase path)と呼ばれるもので、{siteid}にはターゲットサイトのサイトIDを指定する。サイトIDは、IISマネージャからサイトの詳細情報を開けば確認できる。
aspnet_compiler -v {appname} は、aspnet_compiler -v LM/W3SVC/1/Root/{appname} を実行するのと同じである。したがって、サイトIDが1以外のサイトにアプリケーションがデプロイされている場合は、メタベース形式のコマンドを実行しなければならない。Default Web SiteのIDも変更できるので、サイトID=1がDefault Web Siteとは限らないことに注意。
埋め込み先プリコンパイルは管理者モードで起動されたコマンドプロンプトで実行する必要がある。

配置用プリコンパイル用のaspnet_compilerコマンド形式

aspnet_compiler -v / -p "c:\src" -c -f "c:\dst"

・c:\src はコンパイル対象のルートフォルダのパスに置き換えること
・c:\dst は出力先フォルダのパスに置き換えること
・-v -p 以外のオプション指定は任意。
・-u を指定すると更新可能なプリコンパイルになる。

埋め込み先プリコンパイルを管理者モードで実行した場合、Temporary ASP.NET Files フォルダに余計なキャッシュファイルを作成してしまう*1ので、配置用プリコンパイルは管理者モードでないモードで実行することを勧める。

*1:"-v /" を指定した場合、"C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root"にプリコンパイルされたファイルを作成するが、実際にリクエストがあった場合に使用されるキャッシュパスとは異なる。