2012-04-18 206 views
4

我創建了一個C#COM可訪問的DLL,我想在VB6中使用 我能夠在VB6中使用我的COM對象,並且對TLB有一個硬引用。 什麼我想現在要做的是消除這種參考和動態加載 我創造它,如下所示:VB6:運行時錯誤424當調用CreateObject

Dim keylok As Object 
Set keylok = CreateObject("MyClassLib.MyObject") 

我得到錯誤424「必選對象」有一次我打第二行的運行時間。 但是,當我創建它如下:

Dim keylok As MyObject 
Set keylok = CreateObject("MyClassLib.MyObject") 

它工作正常。 我不確定爲什麼會有所作爲。無論如何,我不能使用第二個,因爲我仍然需要有物理參考。

我也嘗試作爲一種調試,以寫入我的COM對象構造函數中的文件,如果它真的被調用。是的,我甚至可以在構造函數中成功調用COM對象中的其他方法。

我甚至能夠動態地加載和使用從其他C#應用程序使用它:

dynamic myObj = Activator.CreateInstance(Type.GetTypeFromProgID("MyClassLib.MyObject")); 

難道任何一個遭遇類似的東西之前?

+4

閱讀http://support.microsoft.com/kb/245115,然後給深思如何後期綁定的作品不同於早期的;特別是,您可以確認您的對象有效的IDispatch嗎? – rskar 2012-04-18 17:12:18

+0

我可以在C#中將其綁定。所以,我會認爲我的組件一般可以延遲。實際上我也有我的構造函數。 – engmtm 2012-04-18 18:13:06

+0

一些額外的信息:我的C#DLL是在VS 2010(.NET 4.0)中構建的 – engmtm 2012-04-18 18:35:38

回答

1

我在@rskar輸入的幫助下找到了解決方案。所以,我想我會回答我的問題,以防有人面臨同樣的問題。

我的對象沒有推動IDsipatch。所以我只需要用InterfaceType(ComInterfaceType.InterfaceIsDual)來裝飾我的C#COM接口就可以實現IUnknown和IDispatch。 它最初是飾有InterfaceType(ComInterfaceType.InterfaceIsIUnknown)

0

無論如何,我認爲你會需要.tlb。 COM對象需要能夠編組,因爲.Net託管在與VB6運行時不同的線程上運行。默認編組使用來自類型庫的信息來執行此操作。 IDIspatch有4種方法,其中2種與訪問類型信息有關。因此,如果您刪除了.tlb,那麼當您創建IDispatch COM時,將嘗試從此調用ITypeInfo並且無法加載註冊的類型庫。如果您消除了.tlb,您將無法編組,您可能需要爲您的界面提供自定義編組器。

+0

沒有「網絡託管」,運行在不同的線程。ComVisible類在主VB6 STA線程上創建並調用。 VB6不會以可靠的方式支持線程,所以不需要進行編組。 Regasm也沒有做任何事情來註冊接口。 – 2012-04-19 17:04:34

+0

感謝您的回覆。解決方案非常簡單。問題是我的C#COM接口沒有推動IDispatch。請檢查我的最新評論在我的文章。 – engmtm 2012-04-19 19:49:25