我有两个COM对象具有不同的GUID
值,但名称相同。 一个是另一个的更新版本。 当我使用Name.exe /regserver
注册时会发生什么? 我已经看了registry,他们都显示了相同的ProgID
,但他们各自的GUID
值是不同的。 他们指向他们在硬盘驱动器上的单独位置。 这是一个问题吗?
我试图让一个项目的旧版本与新版本的项目一起工作(但不能同时运行),我认为这两件事情正在发生冲突。
COM对象是在VB6中创build的。 使用它们的代码是C#。 他们被添加到他们个人的C#项目作为参考。 当一个人注册时,我不能编译另一个(也不能成功运行)。
在调查这个问题时,还有哪些其他信息会有帮助?
将我的评论转换为答案:
您已经创建了一个不兼容旧版本的组件的新版本。
你真的应该改变ProgID
来表明这实际上是一个新的组件。 客户端应用程序必须明确定位新组件或旧组件。 人们往往只是附加一个版本号(例如2
)到ProgId
。
你正在违反硬性的COM规则。 您的更换必须与您更换的组件完全匹配。 或者您必须生成一个新版本:
仔细检查所有这一切的最好方法是运行OleView.exe,File + View Typelib命令。 将类型库内容反编译回IDL,您将看到GUID和接口。 如果你想创建一个完全替代旧的组件,那么一切都必须完全匹配。 完全相同的GUID,完全相同的接口,完全相同的方法顺序和完全相同的参数。
我从来没有从.NET(仅仅是dll)访问VB6 ActiveX exes,所以这是一个黑暗中的镜头(除了太长,足够弱以至于只是一个评论)。
也许你可以为两个VB6组件创建/导出一个.tlb文件来编译你的C#。 你不应该需要exes来编译。
接下来手动添加注册表项,就好像它们具有单独的程序化ID(比如MyComponent.serverClass.1
和MyComponent.serverClass.2
),然后通过名称在C#中加载它们。