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

Thi*_*uda 20 .net c# appdomain late-binding appdomainsetup

我将举一个使用System.Data.SQLite.DLL的例子, 它是一个带有非托管代码的混合程序集:如果我执行这个:

  var assembly= Assembly.LoadFrom("System.Data.SQLite.DLL")
Run Code Online (Sandbox Code Playgroud)

没有异常被抛出,但如果我这样做:

  var rawAssembly = File.ReadAllBytes("System.Data.SQLite.DLL");
  var assembly = Assembly.Load(rawAssembly);
Run Code Online (Sandbox Code Playgroud)

CLR抛出FileLoadException,其中包含"无法验证的代码失败的策略检查.(HRESULT异常:0x80131402)".假设我正在尝试在子AppDomain上加载此程序集,如何自定义AppDomain的安全性以允许我通过策略检查?

Han*_*ant 18

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

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

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

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


Pau*_*der 12

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