我有一个非常奇怪的问题,在 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', on 'Westwind.RazorHosting.RazorEngine`1[TBaseTemplateType]' 违反了类型 'TBaseTemplateType' 的约束。
其中 TBaseTemplateType 与传入的类型相同(即 RazorTemplateBase),RazorEngine 定义如下:
public class RazorEngine<TBaseTemplateType> : MarshalByRefObject
where TBaseTemplateType : RazorTemplateBase
显然,我传递了正确的类型,因为它是实际的限制类型,但不知何故 AppDomain 没有将 Generic 类型识别为相同的类型。
正如我所提到的,它在 Windows 应用程序和测试项目中工作,但在 ASP.NET 中,泛型类型不会跨越 AppDomain 边界进行实例化。使用相同的代码创建一个非泛型类型(即使是从 RazorHosting 继承的该类型 RazorHosting 的相同非泛型版本)并且它工作正常。
难住了。ASP.NET 可以做些什么来使它的行为与在测试项目中运行时如此不同?