我正在尝试在应用程序域中创建一个对象:
var type = typeof (CompiledTemplate);
var obj = (CompiledTemplate) domain.CreateInstanceAndUnwrap (
type.Assembly.FullName, type.FullName);
但是,我总是得到以下错误:
无法将透明代理转换为类型“Mono.TextTemplating.CompiledTemplate”。
我在 .NET 4.0 上运行,而不是 Mono,尽管命名空间可能会提示:)
据我所知,当 .NET 认为类型和程序集在两个域中不完全匹配时,就会发生此错误。但是,在调试时,FullName 和 Location 是相同的。只有 Assembly.Codebase 属性不同 - 在子 AppDomain 中,出于某种原因,其扩展名大写为“DLL”。
我已经尝试将 AssemblyResolve 处理程序添加到 AppDomain,它使用 Assembly.LoadFrom 显式加载文件名,但 CodeBase 的扩展名仍然大写。由于原始程序集也加载了 Assembly.LoadFrom(通过 Mono.Addins),因此 CodeBase 值之间的差异似乎很奇怪。
对于修复或解决此问题有什么建议吗?
最佳答案
您是否遇到了程序集加载上下文的问题?
(例如,参见 here)
您有一个明显位于加载上下文中的类型(因为您正在使用 typeof(CompiledTemplate)
),但您是说辅助 AD 中的类型已加载到加载源上下文中。 ..
你检查过fuslogvw了吗?确定到底加载了哪些程序集? fuslog 跟踪还会告诉您程序集是否正在加载到不同的上下文中。
关于c# - 无法将透明代理强制转换为来自 AppDomain 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655484/