【问题标题】:C# Excel COM plugin assembly bindingRedirect?C# Excel COM 插件程序集绑定重定向?
【发布时间】: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


【解决方案1】:

您可以尝试使用AppDomain.AssemblyResolve 事件。在此事件下,您可以尝试加载您需要的正确版本的程序集。

【讨论】:

  • 感谢您的回答。此事件仅在 .Net 无法加载程序集时触发。我可以用这个事件加载错过的程序集。但是如果 .Net 成功加载另一个版本的程序集,我无能为力。
猜你喜欢
  • 2019-12-21
  • 2012-04-27
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2021-10-18
  • 2021-01-15
  • 2011-03-30
相关资源
最近更新 更多