2

我有两个具有不同GUID值但名称相同的 COM 对象。一个是另一个的更新版本。当我同时使用注册时会发生什么Name.exe /regserver?我查看了注册表,它们都显示为相同的ProgID,但它们各自的GUID值不同。它们指向它们在硬盘驱动器上的不同位置。这是一个问题吗?

我试图让旧版本的项目与新版本的项目一起工作(但不是同时运行),我认为这两件事正在发生冲突。

COM 对象是在 VB6 中创建的。使用它们的代码是 C#。它们作为参考添加到各自的 C# 项目中。注册一个时,我无法编译另一个(也无法成功运行)。

在调查此问题时,还有哪些其他信息会有所帮助?

4

3 回答 3

1

将我的评论转换为答案:

您创建了与旧版本不向后兼容的组件的新版本。

您确实应该更改ProgID以表明这实际上是一个新组件。客户端应用程序必须明确定位新组件或旧组件。人们通常只是2ProgId.

于 2013-09-13T11:36:26.783 回答
1

您违反了硬 COM 规则。您的替换必须与您替换的组件完全匹配。或者您必须生成一个新版本:

  • 为 coclass 使用不同的 [Guid],你做对了。
  • 使用不同的ProgId,你没有这样做。Boilerplate 将在 ProgId 本身中包含一个版本号。所以 Foo.Bar 变成 Foo.Bar.2
  • 对类实现的接口使用不同的 [Guids]。这很容易被忽略,因为它们在 VB6 组件中隐藏得非常好。然而,每当从另一间公寓使用该课程时,这一点至关重要。COM 需要找到组件的类型库,以便知道如何编组接口方法调用。请务必在 C# 代码中显式声明接口。

仔细检查所有这些的最佳方法是运行 OleView.exe、File + View Typelib 命令。这会将类型库内容反编译回 IDL,您将看到 guid 和接口。如果你想为旧组件创建一个精确的替代品,那么一切都必须完全匹配。完全相同的 guid,完全相同的接口,具有完全相同的方法顺序和完全相同的参数。

于 2013-09-13T13:51:51.190 回答
0

我从来没有从 .NET 访问过 VB6 ActiveX exe(只是 dll),所以这是在黑暗中的一个镜头(并且足够弱以至于只是一个评论,只是它太长了)。

也许您可以为两个 VB6 组件分别创建/导出一个 .tlb 来编译您的 C#。你不应该需要exe来编译。

接下来手动添加注册表项,就好像它们具有单独的程序 ID(例如MyComponent.ServerClass.1MyComponent.ServerClass.2)一样,然后在 C# 中按名称加载它们。

于 2013-09-11T21:21:20.647 回答