簡體   English   中英

使用C#重建更新的VB6 COM類替換

[英]VB6 COM Class Replacement With C# Rebuilt Update

我在這里遇到了一個特別棘手的問題,我想在那里提出更多的反饋(我是我工作的公司中唯一的.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

但是在一個例子中,我發現他們似乎已經改變了如何使用這個interop 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

不幸的是,如果這個特定組件仍在使用中,沒有人可以回答這個問題,而這個組件本身就有些令人擔憂。

如果有人做過類似的事情並讓它運轉起來,那就太棒了。

沒問題,只需使用正確的名稱:

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

請注意不同的接口名稱。 不要自己寫。 添加對舊VB6組件的引用,這樣您就可以完全確定是否准確地實現了IOldVb6Version接口,並且與IID,方法,它們的順序和參數完全匹配。 如果您不知道舊的接口名稱,請查看Oleview.exe,File + View Typelib。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM