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 はどうすればよいでしょうか?