用C#重建更新替换VB6 COM类

用C#重建更新替换VB6 COM类,c#,vb.net,com,vb6,vb6-migration,C#,Vb.net,Com,Vb6,Vb6 Migration,我遇到了一个特别棘手的情况,我想抛开它,获得更多的反馈(我是公司中唯一一个为我工作的.NET开发人员,所以没有人能从中恢复过来) 我的任务是替换一个老化的VB6编写的ActiveX组件,该组件由一个应用程序使用,该应用程序包含我要替换的组件的VB6用法和VB.NET用法 我有所有这些组件的完整源代码,所以我可以看到用例 为了便于讨论,可以将这些组件称为: MyVb6.dll MyApp(带有VB.NET和VB6组件) 在MyApp的构建过程中,他们利用TlbImp工具生成互操作库: Intero

我遇到了一个特别棘手的情况,我想抛开它,获得更多的反馈(我是公司中唯一一个为我工作的.NET开发人员,所以没有人能从中恢复过来)

我的任务是替换一个老化的VB6编写的ActiveX组件,该组件由一个应用程序使用,该应用程序包含我要替换的组件的VB6用法和VB.NET用法

我有所有这些组件的完整源代码,所以我可以看到用例

为了便于讨论,可以将这些组件称为:

MyVb6.dll
MyApp(带有VB.NET和VB6组件)

MyApp
的构建过程中,他们利用TlbImp工具生成互操作库:

Interop.MyVb6.dll

用法

在大多数情况下,这一用法与预期的一样,使用
CreateObject()
方法,例如:

私有属性MyProp()作为对象
得到
尝试
如果m_myProp什么都不是
m_myProp=CreateObject(“MyVb6.MyVb6Obj”)
m_myProp.Initialize()
如果结束
捕获:结束尝试
返回m_myProp
结束
然而,在一个实例中,我发现他们似乎改变了如何使用这个互操作dll的策略,并且他们有一个对它的静态引用和一个类型化属性,例如:

Private Property MyProp()作为MyVb6.MyVb6ObjClass'虽然这是强类型的,但它来自互操作dll。。。
得到
如果m_myProp什么都不是
m_myProp=CreateObject(“MyVb6.MyVb6Obj”)
m_myProp.Initialize()
如果结束
返回m_myProp
结束
重建和重新部署整个应用程序的费用是完全不可能的,所以除了替换
MyVb6.dll
,我别无选择

我希望在这里找到的是,如果这是一个实际的解决方案

更换

到目前为止,我所做的是编写替换dll的框架,由于对象实例是使用已知的字符串值创建的,因此我添加了
ProgId
,例如:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid(“xxx”)]
[ProgId(“MyVb6.MyVb6Obj”)]
公共类MyNewCSharpVersion:IMyNewCSharpVersion
{
...
}
显然,对于每个对象,我都维护了一个相同的接口,因此调用应用程序将找到所有需要调用的方法等

然后,当我部署这个组件时,我将取消注册旧的COM组件,并注册我的新组件。这种试图诱使它认为它正在创建同一个对象的尝试真的有效吗

非常棘手的问题

源代码中也有直接使用VB6 dll的示例,例如:

将myObj设置为MyVb6.MyVb6Obj
不幸的是,没有人能回答这个问题,如果这个特定的组件仍然在使用,这本身就有点令人担忧


如果有人做过类似的事情并且成功了,那就很高兴知道了。

没问题,只要使用正确的名称即可:

namespace MyVb6 {
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [Guid("xxx")]
    public class MyVb6Obj : _IOldVb6Version
    {
        ...
    }
}

请注意不同的接口名称。不要自己写。添加对旧VB6组件的引用,这样您就可以完全确保在IID、方法、它们的顺序和它们的参数上进行精确的匹配,从而准确地实现IOldVb6Version接口。如果您不知道旧的接口名称,请使用Oleview.exe、File+View Typelib进行查看。

AFAIK无法执行此操作:.net dll->com->.net dll。但是,您可能会这样做:.NET DLL> COM> VB6DLL> COM> > Net DLL应该考虑拿起Adam Nathan的一本书。它有一章专门介绍如何在.NET组件中重新实现COM接口,以及许多其他好的信息。旧的VB6组件没有定义任何接口,但我认为如果我使用TblImp生成的互操作dll中生成的接口,这应该可以工作。。。看起来很可怕,但如果这就是它所需要的…它确实有接口,它们只是隐藏起来了。但如果使用Oleview或Tlbimp,则肯定非常明显。这并不可怕,将实现与接口隔离是一种标准的互操作方法,在.NET中也很常见。请结束你的问题。我在一般情况下经常使用界面编码,我想把旧的东西放在周围会感觉有点乱。谢谢你的信息,非常感谢。