1

ファイルシステム以外の場所(サービス内など)に「コンテンツ」(ASPX / ASCXおよびアセンブリ)を格納し、必要に応じて動的にロードするASP.NetWebアプリケーションを作成しようとしています。

別の場所からASPX/Master / ASCXファイルを読み取る処理を行うVirtualPathProviderを正常に作成しましたが、これらのASPXページがクラスを継承すると問題が発生します。つまり、コードが遅れている場合です。

別の質問の回答のおかげで、実行時にアセンブリをアプリケーションに正常にロードできるようになりました。しかし、ランタイムがページをコンパイルしようとすると、次のエラーが発生します。

「コンパイラエラーメッセージ:CS0400:タイプまたは名前空間名'Web'がグローバル名前空間に見つかりませんでした(アセンブリ参照がありませんか?)」

[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()] public class default_aspx:global :: Web.Code.CodeBehind、System.Web.SessionState.IRequiresSessionState、System.Web.IHttpHandler

わかりやすいように、コードを要約して、問題の簡単な例を示しました。このコードはここからダウンロードできます

アセンブリは、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;
}

何か案は?

編集 何らかの理由でWeb.Codeアセンブリを更新する必要がある場合、これらの変更を有効にするには、Webプロジェクトの「ReferencedAssemblies」フォルダーにコピーする必要があります。

4

2 に答える 2

1

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

于 2009-11-02T15:03:10.530 に答える
0

わかった。次のことを試してみてください-AssemblyResolveイベントを削除してください。ここで、web.configランタイム構成を使用して、このアセンブリを解決します。<runtime>構成に以下を追加します。

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

なぜ2つのアプローチがあるのか​​、私には説明できません。AppDomain.AssemblyResolveこのランタイムAssemblyBindingは、を処理するときに異なる結果をもたらしますPageBuildProvider。私はPageBuildProviderクラスを調べて、何が起こっているのかについての手がかりを見つけていましたが、それでも運がありませんでした。私の注意を引いたので、おそらくこれをさらに調べ、解決策が見つかったらここに投稿します。

web.configファイルを使用したこのソリューションが機能するかどうかをお知らせください。唯一の注意点は、リソースを使用してアセンブリを保存できないことです。それらをファイルシステム、つまりプロジェクト1の下にあるすべてのフォルダーに保存する必要があります。現在、ReferencedAssembliesフォルダーにあります。

于 2009-07-31T07:43:54.663 に答える