【发布时间】:2020-05-12 23:38:26
【问题描述】:
我正在用 C# 和 .Net 4.8 编写一个 Excel COM 插件。该插件使用 System.Text.Json 包中的 Utf8JsonReader。这个包需要 System.Memory 作为依赖,而 Memory 需要 System.Runtime.CompilerServices.Unsafe 作为依赖,所以 Nuget 为我安装 Unsafe 包 4.0.6.0。运行时,Excel 成功加载了我的 MyDll 插件,但 Unsafe.dll 没有。 .Net Framework 没有读取包含 bindingRedirect 信息的 MyDll.dll.config,并使用 Memory.dll 的 Manifest 中的 4.0.4.1 版本。根据异常的fusionLog,.Net找到dll文件,但得到版本不匹配错误。
经过一番 google,有人说我需要 EXCEL.EXE 附近的 EXCEL.exe.config,而不是 MyDll.dll 附近的 MyDll.dll.config。它有效,但对我来说不是一个好的解决方案,有没有什么好方法可以为 dll 插件定义 bindingRedirect 而无需“破解 Excel 的安装”?
System.Memory.dll 的清单:
Exception的fusionLog,不是Unsafe Dll,而是同样的问题:
【问题讨论】:
-
可以将 4.0.6.0 安装到 GAC 中吗?
-
@MiS 谢谢!主要问题是,.Net 从不尝试加载 4.0.6.0,它试图从磁盘加载 4.0.4.1 版本,.Net 只是忽略了 VS 生成的重新绑定设置。事实上 4.0.6.0 的 dll 就在 MyDll.dll 附近,如果我构建一个 EXE,一切正常。我加了一张fusionLog截图,希望对你有帮助。
-
如果您将所需的版本放在 GAC 中,框架将首先查找并应该找到并加载它。
-
@MiS 经过一些测试,将 dll 安装到 GAC 不起作用。你可以阅读How the Runtime Locates Assemblies。就我而言,运行时在第一步“确定正确的程序集版本”中确定了错误的版本。我将 4.0.6.0 安装到 GAC,运行时找不到它的错误版本。
标签: c# .net excel com .net-assembly