我有一个特别棘手的情况,需要向大家请教一下(因为我是公司里唯一的.NET开发人员,没有人可以交流)。任务让我替换一个老旧的VB6编写的ActiveX组件,这个组件被应用程序消耗,包含了使用VB6和VB.NET的组件。
我拥有所有这些组件的完整源代码,所以可以看到使用情况。
为了讨论方便,这些组件可以称为:
MyVb6.dll
MyApp(带有VB.NET和VB6组件)
MyApp
的构建过程中,它们使用TlbImp工具来生成一个互操作库:
Interop.MyVb6.dll
用法
在大多数情况下,使用方法如预期,使用CreateObject()
方法,例如:
Private Property MyProp() As Object
Get
Try
If m_myProp Is Nothing Then
m_myProp = CreateObject("MyVb6.MyVb6Obj")
m_myProp.Initialize()
End If
Catch : End Try
Return m_myProp
End Get
然而在某些情况下,我发现他们更改了消耗此互操作dll的策略,他们使用了静态引用和类型化属性:
Private Property MyProp() As MyVb6.MyVb6ObjClass 'Whilst this is strongly typed, it is from the interop dll ...
Get
If m_myProp Is Nothing Then
m_myProp = CreateObject("MyVb6.MyVb6Obj")
m_myProp .Initialize()
End If
Return m_myProp
End Get
重新构建和重新部署整个应用程序的费用完全不可行,所以我别无选择,只能替换
MyVb6.dll
。
我希望在这里找到的是这是否是一个实际可行的解决方案...
替换
到目前为止,我已经编写了替换dll的框架,并且由于对象实例是使用已知的字符串值创建的,所以我将其添加为ProgId
,例如:
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("xxx")]
[ProgId("MyVb6.MyVb6Obj")]
public class MyNewCSharpVersion : IMyNewCSharpVersion
{
...
}
显然,我已经为每个对象维护了相同的接口,这样调用应用程序将找到所有预期的方法等。
然后,当我部署它时,我将注销旧的COM组件并注册我的新组件。 这种尝试欺骗它以认为正在创建相同的对象是否实际有效?
非常棘手的问题
源代码中还有一些直接使用VB6 dll的示例,例如:
Dim myObj As MyVb6.MyVb6Obj
不幸的是,没有人能回答这个问题,是否仍在使用这个特定的组件,这本身就有点令人担忧。
如果有人做过类似的事情并且使其工作正常,那就太好了,让我们知道一下。