gpt4 book ai didi

c# - 无法在 COM 可见类库 C# 中加载文件或程序集

转载 作者:太空宇宙 更新时间:2023-11-03 19:01:16 25 4
gpt4 key购买 nike

我创建了一个类库项目,并安装了 Newtonsoft.Json NuGet 包。此操作添加了一个 app.config 文件,其中包含:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>

然后我使类库 COM 可见:

Made library COM visible

当我尝试在另一个 C# WinForms 项目中使用我的类库时,出现错误:

System.IO.FileLoadException : Could not load file or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

直到我在 WinForms 项目中添加了相同的 app.config 行。

现在我试图在 Microsoft Word VBA 开发人员中使用我的程序集(通过 COM 引用),我遇到了同样的错误,但是我不能为 Microsoft Word 创建一个 app.config 文件,对吗?有什么办法,如何解决这个问题?

提前致谢!

最佳答案

是的,这是您在制作 .NET 程序集 [ComVisible] 时会遇到的标准 DLL hell 问题。 CLR 使用其正常方式查找依赖程序集,这些规则在 COM 中不会改变。它首先在 GAC 中查找,然后在 EXE 所在的目录中查找。它不会查看您的 [ComVisible] 程序集所在的目录。否则用Fuslogvw.exe很容易看出来的东西,一定要实践一下。

这个问题有多种解决方案,没有一种是最理想的,因此您必须自己选择最适合您的一种。您应该强烈追求的第一件事是摆脱 .config 文件。 <bindingRedirect>总是生成但通常是不必要的。只有当您引用多个 Nuget 包并且它们不同意使用哪个版本的 Newtonsoft.Json.dll 时才真正需要它。如果这是一个问题,那么只有部署到 Office 文件夹才是可行的,请参阅最后一个项目符号。

  • 将所有内容部署到 GAC。这通常是 COM 的理想解决方案,它通常具有很强的 DLL hell 问题,因为注册是机器范围的。这使得部署更新变得危险,您可能会修复一个程序中的问题,但会破坏另一个程序。缺点是安装要求。以及将 Newtonsoft.Json.dll 放入 GAC 中的可疑做法,该程序集的版本控制历史相当不透明,并被许多其他程序使用。非零几率你会破坏另一个使用它的应用程序,因为它现在加载 GAC 中的副本而不是其本地副本。 FUD 足够强大,可以避免这种情况。

  • 使用 ILMerge,这样您就只有一个 DLL。并不总是有效,它不能处理混合模式程序集,也不能处理绑定(bind)重定向。尝试一下,您很快就会发现。除此之外,唯一的缺点是额外的构建步骤。

  • 订阅 AppDomain.CurrentDomain.AssemblyResolve 事件并帮助 CLR 定位依赖项。当您公开有限数量的类或只有少数类具有依赖性时实用。最好在类的静态构造函数中订阅事件,以便尽早发生。请务必只执行一次。确保在没有调试器的情况下测试发布版本,抖动可能需要在任何代码开始运行之前依赖。

  • 将依赖项复制到 Office 安装文件夹中。这就是 CLR 在检查 GAC 后要查看的地方。如果您需要 bindingRedirect,那么配置文件也需要复制到那里,重命名为 Excel.exe.config 以匹配 Office 程序名称。缺点是管理员不喜欢您弄乱该文件夹。 两个程序执行此操作的问题,第二个覆盖您的 DLL 或 .config 文件,可能在您完成项目多年后。不是你的问题,反正你会接到一个丑陋的电话。

关于c# - 无法在 COM 可见类库 C# 中加载文件或程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35454220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com