我将举一个使用System.Data.SQLite.DLL的示例,它是一个带有非托管代码的混合程序集: 如果我执行这个:
var assembly= Assembly.LoadFrom("System.Data.SQLite.DLL")
不会抛出任何异常,但如果我这样做:
var rawAssembly = File.ReadAllBytes("System.Data.SQLite.DLL");
var assembly = Assembly.Load(rawAssembly);
CLR抛出FileLoadException,出现“无法验证的代码失败的策略检查。(HRESULT异常:0x80131402)”。 假设我正在尝试在子AppDomain上加载此程序集,如何自定义AppDomain的安全性以允许我通过策略检查?
答案 0 :(得分:17)
我们是一个糟糕的异常消息的受害者。不支持使用包含非托管代码的Assembly.Load(byte [])加载程序集。这是feedback item的主题。
更新:链接的反馈项目已消失,作为VS2012发布时清理的一部分被删除。它的唯一部分仍然可以恢复的是这个片段,从另一个网页复制:
“[...]我们只允许加载ILOnly图像[...],因为其他任何东西都不安全” -
更新:使用archive.org备份副本修复链接。
答案 1 :(得分:12)
问题是CLR没有执行正常的DLL加载步骤 - 比如将dll分隔成不同的页面,调整fixup等。当从原始字节加载程序集时,那些原始字节被映射到内存中是,并且只读取托管的元数据。没有任何证据或安全设置会改变这种行为。