【问题标题】:Protobuf-net file or assembly not found when referencing assembly over COM interop通过 COM 互操作引用程序集时找不到 Protobuf-net 文件或程序集
【发布时间】:2018-05-21 11:24:04
【问题描述】:

我正在尝试在 C# 中为 protobuf-net 包编写一个包装器,以使我能够直接从 Excel 中的 VBA 访问协议缓冲区文件。 我已经编写了我的代码,其中引用了通过 nuget 包管理器添加的 protobuf-net。我已使我的程序集 COM 可见,并且我可以从 VBA 访问我的类。
但是,当我尝试加载 protobuffer 文件时,我收到以下消息:

“无法加载文件或程序集 'protobuf-net, Version=2.0.0.668, Culture=neutral, PublicKeyToken=257b51d87d2e4d67' 或其之一 依赖关系。该系统找不到指定的文件。 (ProtoBufInterface.OutputData)"

我已检查 protobuf-net.dll 文件是否正在复制到程序集目录。有什么想法是什么原因造成的,或者我可以做些什么来解决它?

非常感谢!

【问题讨论】:

  • 呃; COM 依赖是一种痛苦;作为一个懒惰的可怕黑客,只是为了看看它是否有效:如果你在 GAC 中安装它(protobuf-net),它工作正常吗?
  • 嗨,马克。感谢您及时的回复。抱歉,我对此很陌生-您能解释一下如何在 GAC 中安装 protobuf-net 吗?谢谢
  • CLR 搜索依赖程序集的方式对于 [ComVisible] 程序集没有改变。它首先在 GAC 中查找,然后在 EXE 目录中查找。并且不在您存储 DLL 的目录中。强烈建议为客户端应用程序使用 GAC 或 regfree 清单,COM 有一个非常讨厌的 DLL Hell 问题,因为注册是机器范围的。这也解决了这个问题。通过将 DLL 复制到与客户端 EXE 相同的目录中来测试您的代码。考虑使用 ILMerge 生成单个可执行文件。
  • 我尝试在 GAC 中注册 protobuf-net.dll,但仍然遇到同样的错误。我还尝试查看 .NET 反射器中的依赖项,但 protobuf-net.dll 中的唯一引用是 mscorlib、System 和 System.Xml。所以正如马克所说,不应该缺少任何东西。

标签: c# com interop protobuf-net


【解决方案1】:

我使用 .NET Reflector 发现了问题。 我引用了另外两个库,一个是 protobuf-net.dll,另一个是第三方库,它本身引用了 protobuf-net.dll。 问题是第三方库(2.0.0.668)中引用的版本与我安装的版本(2.3.3)不同。实际上事后看来,错误消息告诉了我我需要的一切。 用 2.0.0.668 版本替换我的 protobuf-net.dll 参考解决了我的问题。我不需要在 GAC 中单独注册 protobuf-net.dll。

感谢大家一路上的帮助。非常感谢。

【讨论】:

  • 很高兴听到!在 .NET-land 中,您可以使用程序集绑定重定向来解决此问题;不过,不确定这在 COM 互操作方面是如何工作的
【解决方案2】:

protobuf-net.dll 还依赖于您应该添加到引用中的其他 DLL。

如果没有明确指定,您应该使用“depends.net”之类的实用程序。更多信息可以在这个链接中找到:

Modern Equivalent of Visual Studio 6 "Depends" utility

【讨论】:

  • protobuf-net 没有任何非标准依赖;假设我们正在谈论完整的框架(因为:COM 互操作) - 一切都应该在 GAC 中。引用 nuget:i.stack.imgur.com/cKCk2.png
猜你喜欢
  • 2011-05-13
  • 1970-01-01
  • 2015-03-21
  • 2011-08-09
  • 2016-04-18
  • 2011-04-11
  • 2010-10-17
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多