2014-06-12 64 views
1

我最近嘗試將傳統的VB6應用程序移植到.NET。這不是一個完整的端口,但我只關注應用層。我仍然會使用少量的VB6 COM組件。如何將自定義集合類從VB.NET傳遞到VB6?

到目前爲止好,但我最近打了一堵牆。

我需要將.NET自定義集合傳遞給VB6。這可能嗎?

我在.NET端調用的COM方法期望使用泛型對象,但是應用程序立即崩潰:InvalidCastException - 指定的Cast無效。

我偶然發現了一些關於如何將VB6集合傳遞給.NET的文章,但沒有其他方法。我已經嘗試從.NET中繼承/利用幾種不同的集合類型,但迄今爲止都無濟於事。任何幫助表示讚賞。

+0

試試這個http://stackoverflow.com/questions/6231995/accessing-net-collection-in-vb6? – MarkJ

+0

@MarkJ我看着這個問題,它似乎並不重複。有一種方法可以讓VB6相信它正在看到一個VBA.Collection,並在我的回答中描述了它。適用於C#。 – Markus

+0

這就是爲什麼這些問題是不同的 - 我相信@RyanMac希望保留他正在談論的VB6組件的二進制兼容性,可能還有二進制文件本身。 6231995的問題和答案似乎不希望保持兼容性。 – Markus

回答

1

在您的.NET集合類實現的COM接口聲明中,爲返回您的枚舉數的方法設置DispId爲-4。調用該方法「GetEnumerator」。另一方面,如果你真的想模擬一個VBA.Collection對象,而不是僅僅支持VB6中的For Each,你可以在你的VB.NET類庫中設置對VBA類型庫的引用(假設你正在創建一個類庫)並在你的VB.NET類中實現_Collection。

<Guid("A4C4671C-499F-101B-BB78-00AA00383CBB")> 
<ComDefaultInterface(GetType(_Collection))> 
<ComVisible(False)> 
Public Class VBACollection 
    Implements _Collection 
    . 
    . 
    . 
End Class 

然後只是實現_Collection接口。如果VB.NET不喜歡接口名稱中的下劃線,則可能需要將其轉義。

+0

仍然沒有骰子。看起來好像VB6想讓我爲它提供VBA.Collection類型,但是你不能在.NET中實例化這個類(儘管你可以使用它)。 – RyanMac

+0

啊,好的,所以VB6方法期待VBA.Collection?或者,他們是否接受您的自定義集合類型,然後嘗試使用For Each? (因爲這需要兩種不同的解決方案。) – Markus

+0

我添加了一個模仿VBA.Collection對象的解決方案。我最初的參考工具是C#,我將它翻譯成VB.NET,所以我很抱歉如果它不是100%。 (這個概念是一樣的。) – Markus

相關問題