COM对象注册 – 允许多个?

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

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

COM对象是在VB6中创build的。 使用它们的代码是C#。 他们被添加到他们个人的C#项目作为参考。 当一个人注册时,我不能编译另一个(也不能成功运行)。

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

将我的评论转换为答案:

您已经创建了一个不兼容旧版本的组件的新版本。

你真的应该改变ProgID来表明这实际上是一个新的组件。 客户端应用程序必须明确定位新组件或旧组件。 人们往往只是附加一个版本号(例如2 )到ProgId

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

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

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

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

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

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