我有一个非常奇怪的问题,我在ASP.NET内部运行时无法将泛型类型加载到另一个AppDomain中,但它可以在我的Test项目和Console应用程序中运行。
相关代码基本上是这样的:
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可以做些什么来使这种行为与在测试项目中运行时的行为完全不同?
答案 0 :(得分:0)
之前我遇到过这个奇怪的问题。它似乎归结为Shadow Copy(ASP.NET默认使用),每个AppDomain的ApplicationBase和Load Contexts的组合。
已经有一段时间了,因为我脑子里有这个问题,但看看我对这个问题的回答,看看是否有帮助: