2

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

4

1 回答 1

0

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

自从我的大脑出现这个问题以来已经有一段时间了,但请查看我对这个问题的回答,看看是否有帮助:

域问题

于 2012-11-01T00:19:00.463 回答