2011-07-10 50 views
1

我知道我在6年前解決了同樣的問題......但我無法完全記住這個技巧是什麼。VB6 .NET互操作對象需要

我有一個.NET類。它是COM可見的(但不是COM註冊)。它是由於調用COM註冊類而返回的。所以,我的VB6代碼結束了

Dim instance as Variant 
' call .NET exposed tlb to set instance with a COM visible class 
Dim wrapper as New ComWrapper ' this is a .NET class COM exposed and registered 
Set instance = wrapper.MyClassInstance ' MyClassInstance is an instance of COM visible, but not COM registered MyClass defined below 
instance.DoIt 1 

相關類MyClass的

public class MyClass 
{ 
    public void DoIt(int id) { ... } 
} 

呼叫instance.DoIt 1拋出一個異常 「所需的對象」。如果我沒有記錯的話,它與整數1需要被裝箱或取消裝箱或某事有關,VB6不會爲你自動執行......但我不記得如何解決它。 ..如果方法DoIt沒有參數,事情工作正常...

任何人都知道如何解決這個問題?

謝謝。

回答

2

它將是一個盒裝的短小,VB6整數是16位。此外,在VB6中傳遞的默認參數是ByRef。聲明參數對象應該工作。這是很久以前,但我認爲語法是錯誤的。它應該是

instance.DoIt 1 

Call instance.DoIt(1) 

注意括號。沒有理由遲到。只要你的類是[ComVisible],它就會出現在類型庫中,你可以聲明VB6變量類型以允許編譯器檢查你的代碼並生成最優化的調用。註冊課程不是必需的。

Dim instance As MyClass 
+1

MyClass是在一個單獨的DLL,我不想註冊多個類型的庫進行通信。不得不註冊一個類型庫已經很麻煩。 – Jeff

+0

你不*想要註冊一個類型庫。在VB6中使用項目+參考,瀏覽以添加.tlb –

+0

據我所知,這樣做可以添加要求通過regasm將dll註冊爲tlb。這第二個程序集是一個.NET COM可見,非regasm'd類庫。 – Jeff

0

通過聲明Object來嘗試後期綁定到instance