ここ一週間ほどASP .NET 1.1アプリを2.0に変換する作業をしています。変換作業をしているうちにどうしても解決できない問題に出くわしました。それはApp_CodeからUserControl(.ascxによって作成されたクラス)を強い型を保持したままインスタンスの作成ができないことです。下のコードをご覧ください。


Dim ExecutingAssembly As [Assembly] = [Assembly].GetExecutingAssembly()
Dim strClass As String = “MyUserControl”
Dim QuestionControl As BaseQuestion = CType(ExecutingAssembly.CreateInstance(strClass), BaseQuestion)


このコードは実際ASP .NET 1.1ではきちんと動作します。というのはVS 2003でウェブアプリケーションをコンパイルするとすべてのクラスが一つのアセンブリにコンパイルされますので、同じアセンブリに存在するクラスだったらCreateInstanceメソッドでインスタンスを作成できます。しかし、ASP .NET 2.0ではそれができません。Dim ExecutingAssembly As [Assembly] = [Assembly].GetExecutingAssembly()を実行し、ImmediateウィンドウでExecutingAssemblyのLocationプロパティを見てみると、下のパスに一時的なアセンブリが作成されてるのが分かります。


C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\datalabsxc.clinicalweb\c6b27055\86bf8e3c\App_Code.ydhsgwxr.dll


このアセンブリをReflectorで読み込ませてみると、すべてApp_Codeの下にあるクラスだけがコンパイルされててUserControlによって作成されたクラスは見当たりません。つまり上のコードでQuestionControlは常にNothingになるのです。この問題はASP .NET 2.0コンパイラのアーキテクチャが全バージョンとは全く変わってApp_CodeからUserControlのクラスが参照できなくなっているからです。


この質問をASP .NETのアーキテクトであるScott Guthrieさんに今朝メールしたら、早速お返事をいただきました。App_CodeからUserControlを強い型で参照する場合には、Visual Studio 2005 Web Application Projects (Beta V2 Preview)をインストールしてVS 2003のASP .NETアプリケーションのモデルをサポートできるようにしてやるといいということでした。これは現在Previewモードでまだリリースはされていないということです。3月の下旬ぐらいにはリリースできればということでした。


またこのプロジェクトツールに関してチュートリアルなどもScott Guthrieさん自身が書かれたようなので、こちらを参照してみてください。

コメント書き込み