无法将泛型类型加载到ASP.NET应用程序中的另一个AppDomain中

时间:2012-10-31 00:56:54

标签: c# asp.net appdomain

我有一个非常奇怪的问题,我在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可以做些什么来使这种行为与在测试项目中运行时的行为完全不同?

1 个答案:

答案 0 :(得分:0)

之前我遇到过这个奇怪的问题。它似乎归结为Shadow Copy(ASP.NET默认使用),每个AppDomain的ApplicationBase和Load Contexts的组合。

已经有一段时间了,因为我脑子里有这个问题,但看看我对这个问题的回答,看看是否有帮助:

Domain problems