ASP.NET ベースの web アプリケーションで、コンパイル済みのアセンブリが HDD のどこに保存されるかについて、調べたことを備忘録として書いておきます。
コンパイルの方法も保存場所も、Web サイトプロジェクトか Web アプリケーションプロジェクトのどちらで作っているかによって違ってきます。
Web サイトプロジェクト (Web Forms)
Web サイトプロジェクトでは、ソースファイルをそのまま Web サーバー (IIS) の仮想ディレクトリに配置します。(プリコンパイルをしない場合です)
ユーザーが Web サイトの ASP.NET ページ (.aspx ファイル) などのリソースを最初に要求したときに、ページやコードファイルが Web サーバー (IIS) によって動的にコンパイルされます。
コンパイルされたコードは Temporary ASP.NET Files フォルダーにキャッシュされ、同じページに対するその後の要求ではキャッシュのコンパイル済みコードを使用するので、効率良く処理されます。
その詳細については、MSDN ライブラリ ASP.NET の動的コンパイルの概要 を参照してください。
Web アプリケーションプロジェクト (Web Forms)
Web アプリケーションプロジェクトの場合は、Visual Studio を使用してプロジェクトの Bin フォルダーに、単一のアセンブリを、手動で作成します。(Web サイトプロジェクトのように Web サーバーによって自動的にコンパイルされない)
Web サイトプロジェクトと Web アプリケーションプロジェクトとの違いについては、MSDN ライブラリ Visual Studio での Web アプリケーション プロジェクトと Web サイト プロジェクト を見てください。
そのページにも書いてありますが、日本語訳がイマイチなので、原文の Compilation のセクションの説明を以下に抜粋します。
"For web application projects, you typically build the project in Visual Studio or by using the ASP.NET batch compiler on a computer that is not the production IIS server. All code-behind class files and standalone class files in the project are compiled into a single assembly, which is then put in the web application project's Bin folder. (The .aspx and .ascx files are compiled dynamically in a manner similar to what is done for web site projects.)"
つまり、コードビハンド(.aspx.cs)や独立したクラスファイルは、Visual Studio(または ASP.NET バッチ コンパイラ)を使用して、手動で単一アセンブリにコンパイルして、アプリケーションルート直下の Bin フォルダに配置します。運用環境では、その単一アセンブリを Web サーバーにコピーして使います。
一方、.aspx と .ascx(ページディレクティブと HTML デザインブロック)は、Web サイトプロジェクトと同様に、Web サーバーで動的にアセンブリにコンパイルされ、Temporary ASP.NET Files フォルダに保存されます。
コードの継承関係を見れば分かると思いますが、Page ← .aspx.cs ← .aspx となっており(矢印の方向が継承元)、実行時に両方メモリーにロードされ、合体して動作するようになっています。
MVC アプリ
.NET Framework 版の MVC アプリの場合は上の「Web アプリケーションプロジェクト」と同様です。
Controller など拡張子が cs のファイルは、Visual Studio を使用して手動で単一アセンブリにコンパイルし、アプリケーションルート直下の Bin フォルダに配置します。運用環境では、その単一アセンブリを Web サーバーにコピーして使います。
View (cshtml ファイル) は、Web Forms アプリの aspx ファイルと同様に、デフォルトではランタイムコンパイルとなり、Web サーバーで動的にアセンブリにコンパイルされ Temporary ASP.NET Files フォルダに保存されます。
ASP.NET Core アプリ
ASP.NET Core アプリの場合はデフォルトではビルド時及びデプロイ時に単一 dll にコンパイルされます。
詳しくは Microsoft のドキュメント「ASP.NET Core での Razor ファイルのコンパイル」を見てください。