ASP.NETでは複数フレームワーク対応はどのように行われているのでしょうか。
これは、ターゲットフレームワークを変更したときにweb.configがどのように変わるかを見ればすぐわかります。
2.0がターゲットの場合、web.configにはほとんど記述がありませんが、3.5に変更するといろいろな記述が増えます。
その中でも重要なのはsystem.web-compilation-assembliesに3.5で利用されるdllが追加されること、また、system.codedom-compilers-compilerで利用されるコンパイラのバージョンが3.5用に設定されることの2点です。
さて、このweb.configでの設定ですが、どこまで影響を与えているのか確かめてみましょう。
ターゲットを3.5にしたときには特に影響は見えないので、ターゲットを2.0としてWebサイトプロジェクト、Webアプリケーションプロジェクトを構築します。
○インラインコードにvarを記述
まずWebサイトでインラインでvarを利用したプログラムを記述したaspxファイルを用意します。
<%@ Page language="c#" %>
<script runat="server">
void Page_Load(Object sender, EventArgs e)
{
var tmp = "テスト";
Message.Text = tmp;
}
</script>
<html>
<body>
<form id="Form1" runat="server">
<asp:label id="Message" runat="server"/><br />
</form>
</body>
</html>
こんなファイルを作成し、実行すると、'var'が見つからない、というコンパイルエラーが発生します。
次にWebアプリケーションで同じaspxファイルを実行してみます。
Webアプリケーションでwebフォームページを追加すると勝手にコードビハインドのファイルが追加されてしまいますが、そのコードファイルは削除し、aspxファイルを上記のとおり書き換えて実行してみればよいでしょう。
この場合も'var'が見つからない、というコンパイルエラーが発生します。
○コードビハインドファイルにvarを記述
次にWebサイトのaspxファイルにラベルを追加し、コードビハインドファイルのPage_Loadからそこに値を設定するようなプログラムを記述してみましょう。
protected void Page_Load(object sender, EventArgs e)
{
var tmp = "テスト";
Label1.Text = tmp;
}
こんな感じでプログラムを記述し、実行すると、やっぱり'var'が見つからない、というコンパイルエラーが発生します。
さて、Webアプリケーションで同じようにコードビハインドファイルに記述し、実行してみるとどうでしょうか?
このとき、エラーは発生せず、きちんとページが表示され、そこに"テスト"という文字列が表示されます。
この動作ですが、WebアプリケーションプロジェクトとWebサイトプロジェクトの違いがしっかり頭にはいっていれば不思議なことはないはずです。
Windowsアプリ、コンソールアプリ編で記述したように、VS2008ではコンパイラはC# 3.0のコンパイラを利用します。
Webアプリケーションプロジェクトで最初にすべてのコードをコンパイルするときは、VS2008が行う作業なので、このタイミングではC# 3.0のコンパイラが利用されるのです。このため、varはエラーになりません。
Webアプリケーションプロジェクトでも、aspxファイルからソースが生成され、コンパイルが行われるときはweb.configに記述されたコンパイラが利用されるため、ターゲットフレームワークが2.0で特にweb.configにコンパイラの記述がない場合はC# 2.0のコンパイラを利用し、varはエラーとなります。
Webサイトプロジェクトではすべてのコードは実行時にコンパイルされるため、web.configの設定に従いC# 2.0のコンパイラが利用されるために、インラインでもコードビハインドでもvarはエラーになります。
ちょっとややこしいかなぁ?
どのタイミングで、何が、なぜ動くのか、という観点で整理して考えていくと理解できるんじゃないかと思います。