22

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

4

2 回答 2

20

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

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

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

更新:与archive.org 备份副本修复的链接。

于 2010-05-31T17:43:49.063 回答
12

问题在于 CLR 不执行正常的 DLL 加载步骤 - 例如将 dll 单独的部分映射到不同的页面、调整修复等。当从原始字节加载程序集时,这些原始字节按原样映射到内存中,并且只读取托管元数据。再多的证据或安全设置都不会改变这种行为。

于 2011-05-27T00:58:00.087 回答