如何动态加载包含非托管代码的原始程序集?(绕过“无法验证的代码失败的策略检查”异常)

时间:2010-05-31 17:31:43

标签: c# .net appdomain late-binding appdomainsetup

我将举一个使用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的安全性以允许我通过策略检查?

2 个答案:

答案 0 :(得分:17)

我们是一个糟糕的异常消息的受害者。不支持使用包含非托管代码的Assembly.Load(byte [])加载程序集。这是feedback item的主题。

更新:链接的反馈项目已消失,作为VS2012发布时清理的一部分被删除。它的唯一部分仍然可以恢复的是这个片段,从另一个网页复制:

  

“[...]我们只允许加载ILOnly图像[...],因为其他任何东西都不安全” -

更新:使用archive.org备份副本修复链接。

答案 1 :(得分:12)

问题是CLR没有执行正常的DLL加载步骤 - 比如将dll分隔成不同的页面,调整fixup等。当从原始字节加载程序集时,那些原始字节被映射到内存中是,并且只读取托管的元数据。没有任何证据或安全设置会改变这种行为。