2009-07-30 6 views
1

"コンテンツ"(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」フォルダにコピーする必要があります。

答えて

0

OK。以下を試すことができますか?AssemblyResolveイベントを削除してください。このアセンブリを解決するために、web.configランタイムコンフィグレーションを使用するようになりました。 <runtime>構成では、以下を追加します - PageBuildProviderを扱うときAppDomain.AssemblyResolveと、このランタイムAssemblyBinding異なる結果を与える二つのアプローチがなぜ

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="ReferencedAssemblies" /> 
</assemblyBinding> 

私は自分自身に説明することはできません。私はPageBuildProviderクラスを見て、何が起こっているのかの手掛かりを見つけましたが、まだ運がありません。私はおそらくこれに注目して、さらに何か解決策が見つかると、ここに投稿します。

web.configファイルを使用したこのソリューションが役立つかどうかを教えてください。唯一の注意点は、アセンブリを格納するためのリソースを使用できないことです。 ReferencedAssembliesフォルダにあるように、プロジェクトシステムの下にあるフォルダをファイルシステムに保存する必要があります。

+0

Hey Ivan、私は現在、この手法を使用する可能性について調査中ですが、ファイルシステムに書き込む必要はないと考えています。 理想的には、これらのアセンブリはメモリ常駐のみです。 しかし、素晴らしいアイデア。 –

+0

これは私がやることですが、Assembly.LoadFromFile(...)メソッドを使用してファイルシステムからアセンブリがロードされている場合にのみすべて動作します。さまざまな負荷コンテキストがあります。 http://msdn.microsoft.com/en-us/library/dd153782(v=vs.110).aspx –

1

DBからアセンブリをロードしようとするとき(AssemblyResolveイベントを使用して)同じ問題が発生しました。しかし、ディスクからアセンブリを読み込んだり、少なくとも.dllファイルのコピーをディスクのどこかに保存するとうまくいくようです。