2012-10-31 22 views
2

我有一个非常奇怪的问题,我无法将泛型加载到另一个AppDomain在ASP.NET内运行时,但它在我的测试项目和一个控制台应用。无法加载到另一个AppDomain的泛型类型在ASP.NET应用程序

相关的代码确实基本上是这样的:

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是(即RazorTemplateBase)与RazorEngine通过同一类型这样定义:

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

显然我传递正确的类型,因为它是实际的约束类型,但不知何故AppDomain不认为通用类型是相同的。

正如我所提到的,它适用于Windows应用程序和测试项目,但在ASP.NET内部,通用类型不会跨AppDomain边界实例化。使用相同的代码来创建非泛型类型(甚至是从RazorHosting继承的此类型的RazorHosting的非泛型版本),并且它工作正常。

难倒。 ASP.NET可以做些什么来使它的行为与在测试项目中运行时有所不同?

+0

我认为拉塞尔是正确的。这可能是一个影子复制问题。尝试用templateType.Assembly.Location替换AssemblyPath。 –

回答

0

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

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

Domain problems

相关问题