我有一个非常奇怪的问题,当我在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中运行时,我会得到泛型类型参数的类型错误:
'Westwind.RazorHosting.RazorEngine`1TBaseTemplateType‘上的GenericArguments,’WestWind.RazorHost.RazorTemplate type‘违反了类型'TBaseTemplateType’的约束。
其中TBaseTemplateType是传入的相同类型(即。RazorTemplateBase),其RazorEngine定义如下:
public class RazorEngine<TBaseTemplateType> : MarshalByRefObject
where TBaseTemplateType : RazorTemplateBase显然,我传递的是正确的类型,因为它是实际的约束类型,但不知何故,AppDomain并没有承认泛型类型是相同的。
正如我前面提到的,它在Windows应用程序和测试项目中工作,但是在ASP.NET内部,泛型类型不会跨AppDomain边界实例化。使用相同的代码创建一个非泛型类型(即使是继承自RazorHosting的该类型RazorHosting的非泛型版本),它也可以正常工作。
不知所措。在测试项目中运行时,ASP.NET能做什么使它的行为变得如此不同呢?
发布于 2012-11-01 00:19:00
我以前也遇到过这个奇怪的问题。它似乎归结为Shadow副本( ASP.NET默认使用)、每个AppDomain的ApplicationBase和加载上下文的组合。
我的脑子里有这个问题已经有一段时间了,但是看看我对这个问题的答案,看看这是否有帮助:
https://stackoverflow.com/questions/13149771
复制相似问题