"コンテンツ"(ASPX/ASCXおよびアセンブリ)をファイル以外の場所に保存するASP.Net Webアプリケーションを作成しようとしていますシステム(例えば、サービスの内部)で実行され、必要に応じて動的にロードされます。動的にロードするページクラス/アセンブリ:グローバル名前空間でタイプまたは名前が見つかりません
別の場所からASPX/Master/ASCXファイルを読み書きするVirtualPathProviderを正常に作成しましたが、これらのASPXページがクラスを継承するときに問題が発生しています。
another questionの回答により、実行時にアセンブリにアプリケーションをロードすることができました。私はあなたが見ることのために簡単であるように間違っている何が起こっているかの簡単な例に私のコードを煮詰めてきた
"Compiler Error Message: CS0400: The type or namespace name 'Web' could not be found in the global namespace (are you missing an assembly reference?)"
[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()] public class default_aspx : global::Web.Code.CodeBehind, System.Web.SessionState.IRequiresSessionState, System.Web.IHttpHandler
:私のランタイムが私のページをコンパイルしようとしたとき、私は次のエラーを取得します。 You can download this code here。
アセンブリは、実行時にAppDomain.AssemblyResolveイベントを使用して動的にロードされます。これはglobal.asaxにあり、次のようになります。
protected void Application_Start(object sender, EventArgs e)
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Assembly_Resolve);
}
Assembly Assembly_Resolve(object sender, ResolveEventArgs args)
{
Assembly assembly = AppDomain.CurrentDomain.Load(Resources.Web_Code);
if (args.Name == assembly.FullName)
{
return assembly;
}
return null;
}
アイデアはありますか?
EDIT 何らかの理由であなたがWeb.Codeアセンブリを更新する必要がある場合 - あなたは、これらの変更を有効にするためのWebプロジェクトの「ReferencedAssemblies」フォルダにコピーする必要があります。
Hey Ivan、私は現在、この手法を使用する可能性について調査中ですが、ファイルシステムに書き込む必要はないと考えています。 理想的には、これらのアセンブリはメモリ常駐のみです。 しかし、素晴らしいアイデア。 –
これは私がやることですが、Assembly.LoadFromFile(...)メソッドを使用してファイルシステムからアセンブリがロードされている場合にのみすべて動作します。さまざまな負荷コンテキストがあります。 http://msdn.microsoft.com/en-us/library/dd153782(v=vs.110).aspx –