我知道这是一个非常古老的问题,但我刚刚遇到了这个问题,并且能够使用与接受的答案不同的方法来修复它,因为这是谷歌搜索错误消息时的第一个结果,我认为它会很有用如果我分享我的解决方案给其他人。
当我试图与一个硬件集成时,我遇到了这个问题。硬件有自己的安装程序,可以将 DLL 注册到 GAC。它安装的 DLL 有 2 个依赖 DLL,但由于某种原因,当安装程序运行时,它没有注册依赖 DLL。
基本上这种情况是入口 DLL 在 GAC 中注册,它的两个依赖 DLL 没有在 GAC 中注册,但确实存在于可执行文件旁边。
当我运行我的程序并尝试使用该硬件时,该程序正在寻找可执行文件旁边的入口 DLL,但它找不到。然后程序会转到 GAC,在那里它会找到入口 DLL。一旦进入硬件的 DLL,它最终会尝试使用不在 GAC 中但在可执行文件旁边的依赖 DLL。将 GAC 调出到可执行文件旁边的 DLL 会引发部分受信任的调用者错误。
我通过在可执行文件旁边放置条目 DLL 的副本来解决这个问题。
我很好奇什么场景会起作用以及什么会导致安全错误,我发现这些场景可以按预期工作:
- 可执行文件旁边的所有三个 DLL。
- GAC 中的所有三个 DLL。
唯一始终失败的情况是任何层都在 GAC 内部,而任何依赖 DLL 都在 GAC 外部。
失败的场景#1:
- GAC中的入口DLL
Exe 旁边的 DLL #2 和 DLL #3
失败的场景#2:
- GAC 中的条目 DLL 和 DLL #2
DLL #3 旁边的 Exe
失败的场景#3:
- GAC 中的条目 DLL 和 DLL #3
exe 旁边的 DLL #2
- (可以预见)未能将 DLL #2 作为故障 DLL。
我没有对其进行测试,但我认为这是一个安全的假设,即如果条目 DLL 和 DLL #3 位于可执行文件旁边,而 DLL #2 位于 GAC 中,那么 DLL #3 将出现故障问题。