这类似于Odd Exception in MVC 3 Project。
我们有一个完全信任的ASP.NET 4.0应用程序。我们需要在web.config中包含以下行,否则我们使用的其中一个库不起作用。 (因为它明确使用了以前版本的.NET中现在过时的CAS模型)。
<trust legacyCasModel="true" />
鉴于此设置,我们无法使用动态关键字或依赖它的ASP.NET MVC的某些功能。
例如,以下代码会导致异常:
dynamic d = new object();
d.test = "jason";
例外是:
Dynamic operations can only be performed in homogenous AppDomain.
如果legacyCasModel设置为true,我有什么方法可以使动态关键字有效? (如果设置为false,一切正常,除了需要它的库。)
想法:
鉴于我完全信任,我假设AppDomain中的一个程序集正在使用减少的权限(因此非同类)。有没有办法让我简单地告诉它以完全信任模式运行,使AppDomain同质化?
我是否能够以某种方式重构我的代码以在另一个AppDomain中加载有问题的程序集?我不熟悉这种做法的典型方法,但看起来很复杂。
我可以启用其他一些神奇的配置设置吗?
答案 0 :(得分:1)
我没有使用太多的DLR,但我只是尝试了快速测试。在控制台应用程序中,相当于您的命令失败...
dynamic d = new object();
d.test = "jason";
Console.WriteLine(d.test);
但这成功了......
dynamic d = new ExpandoObject();
d.test = "jason";
Console.WriteLine(d.test);
使用动态对象时,您可能需要使用ExpandoObject而不是普通的旧对象。
如果ExpandoObject无法满足您的需求,可以使用像http://clay.codeplex.com/
这样更强大的功能===编辑===
如果我完全阅读这个问题,请帮助...
将<trust legacyCasModel="true" level="Full" />
添加到混合中会导致两者都失败并显示错误。
“legacyCasModel”强制使用非同类域,因为它是pre-.net4的处理方式。这意味着动态对象和旧CAS库不兼容。
我能看到的唯一有效的解决方法是将旧的CAS库抽象为run in a seperate application domain。