2

ASP.NET 内で実行しているときにジェネリック型を別の AppDomain にロードできないという非常に奇妙な問題がありますが、テスト プロジェクトとコンソール アプリでは機能します。

関連するコードは、基本的にこれを行います。

Assembly ass = Assembly.GetExecutingAssembly();
string AssemblyPath = ass.Location;

var templateType = typeof(RazorEngine<RazorTemplateBase>);

object instance = LocalAppDomain.CreateInstanceFrom(AssemblyPath,
                                             templateType.FullName)
                                .Unwrap();

コードは最後の行で爆発します。AppDomain が存在し、そのベース実行と bin パスが元の AppDomain に一致します。

テスト プロジェクトでこのコードを実行すると、問題なく動作します。インスタンスが (TransparentProxy リモーティング参照として) 作成され、すべて問題ありません。

ASP.NET で実行すると、ジェネリック型パラメーターで型エラーが発生します。

GenericArguments[0]、'Westwind.RazorHosting.RazorTemplateBase'、'Westwind.RazorHosting.RazorEngine`1[TBaseTemplateType]' は、タイプ 'TBaseTemplateType' の制約に違反しています。

ここで、TBaseTemplateType は、RazorEngine が次のように定義された、渡されたものと同じ型 (つまり、RazorTemplateBase) です。

public class RazorEngine<TBaseTemplateType> : MarshalByRefObject
    where TBaseTemplateType : RazorTemplateBase

明らかに、それは実際の拘束タイプであるため、正しいタイプを渡していますが、どういうわけか、AppDomain は Generic タイプを同じものとして認識していません。

前述したように、Windows アプリケーションとテスト プロジェクト内では機能しますが、ASP.NET 内では、ジェネリック型は AppDomain の境界を越えてインスタンス化されません。同じコードを使用して非ジェネリック型 (RazorHosting から継承するこの型 RazorHosting の同じ非ジェネリック バージョンであっても) を作成すると、正常に動作します。

困惑した。テスト プロジェクトで実行する場合とは異なる動作をさせるために、ASP.NET はどうすればよいでしょうか?

4

1 に答える 1

0

以前にこの奇妙な問題に遭遇しました。これは、シャドウ コピー (ASP.NET が既定で使用する)、各 AppDomain の ApplicationBase および Load Contexts の組み合わせに帰着するようです。

脳にこの問題が発生してからしばらく経ちましたが、この質問に対する私の回答をチェックして、それが役立つかどうかを確認してください。

ドメインの問題

于 2012-11-01T00:19:00.463 に答える