【发布时间】:2014-05-28 18:34:08
【问题描述】:
我最近被指派用 C++ 编写一些代码,这些代码调用用 VB.net 编写的 DLL。 VB.net DLL 实际上是由我公司的另一个小组编写的。由于公司内部的地盘之争,他们不会让我看到他们的代码,但是当我提出问题时他们会做出回应。编写 VB.net 代码的团队在地球的另一端,我问他们的每一个问题都需要一天的时间。处于有趣的位置,但政治似乎无法克服。
VB.net 和 C++ 代码上的所有工作都是使用 Microsoft Visual Studio 2010 完成的。我已经使用 regasm 注册了 DLL。我可以看到所有类和接口的 GUID。我使用 oleview 查看生成的类型库文件的内容,并验证这些项目是否显示在我机器上的注册表中。
VB.net DLL 已被证明可以工作,当它们在 VB.net 框架内执行时,它们都可以在其中被引用和共享,但我认为没有投入任何精力进行测试这些 DLL 使用 COM 接口。
这是我第一次涉足 COM。从我一直在做的阅读来看,COM 似乎是相对较旧的技术,但它是迄今为止我发现的唯一途径,它允许我混合语言。如果有人有更好的建议,我会全力以赴。我还是想追这个,因为我觉得我真的很接近了。
我已经设法使用 CoInitialize 和 CoCreateinstance 调用这些 DLL 中的方法。早些时候,我发现有些类被标记为不可创建,或者接口不是公共的。我告诉 VB.net 开发人员。他们做了一些更改,并给我发送了另一组 DLL,我能够访问以前未公开的接口。
我正在调用这些 VB.net DLL,代码成功返回,但似乎对我尝试初始化的硬件没有任何影响。我知道这些 VB.net DLL 依赖于其他深几层的 VB.net DLL。我怀疑我正在设法调用顶级 DLL,但是一旦它调用另一个 DLL,我不确定会发生什么,而且我没有可见性。我比较确定对其他 DLL 的调用不支持 COM。
我正在寻找一些关于如何调试或深入挖掘的建议。有一次,当调用任何其他这些其他 DLL 时,我遇到了错误,也就是说:
"Driver class 'foo' could not be created. Ensure class name and DLL version are correct."
在彼此之间调用的所有 VB.net DLL 都会弹出此错误。我将所有 DLL 复制到与可执行文件相同的位置,这些错误就消失了。
我做了一些研究,表明在这种情况下需要仔细管理堆栈状态,但我不确定 VB 代码中需要做什么(如果有的话)。
VB.net DLL 是否需要做任何事情来处理这个问题?当我从 C++ 调用 VB.net DLL 时,VB.net DLL 是否可以在引擎盖下相互跳跃,或者整个解决方案是否需要重新架构?我可以向 VB.net 开发人员发送什么样的请求 这将允许我从 C++ 调用顶级例程,进而允许 VB.net DLL 在彼此之间调用?
巧合的是,以前有一个项目,本质上非常相似,这一切都有效,但有一个显着差异 - 所有 VB.net 代码都包含在一个 DLL 中。我认为我的问题可能与 VB.net DLL 无法相互调用有关,但我无法找到任何回答此特定问题的网站。这是允许的吗?当顶层调用通过 COM 来时,是否需要修改 VB.net DLL 以允许调用其他 DLL?
【问题讨论】:
-
尽管信息量明显丰富,但您基本上要问什么尚不清楚。但我认为它相对简单。这些 DLL 是否公开 COM 类?如果是这样,请使用 COM。他们公开 .NET 类吗?如果是这样,请使用 .NET。
-
对不起,如果我没能清楚地表达我的问题。菲利普的回答抓住了我想问的本质。我调用的 DLL 是用 VB.net、AFAIK 编写的,但它们是使用 CoInitialize 和 CoCreateInstance(它们是 COM)来访问的。这是否意味着我正在混合使用 COM 访问 .net DLL?