【发布时间】: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