2015-08-28 73 views
3

我有一個.tlb文件,該文件通過COM公開C#DLL的函數。我希望在運行時加載這個.tlb,並使用我的本地項目中的函數。在運行時加載和使用類型庫(.tlb)

雖然我可以通過使用LoadTypeLib函數加載庫,但我不確定ITypeLib返回如何幫助我使用.NET DLL中的函數。與常規DLL,我可以用GetProcAddressDLL手柄和獲取函數的地址,但我不認爲它會與類型庫工作?

如何,那麼,這應該接近?

+0

您是否想在運行時執行此操作,例如如果你正在創建一個腳本語言綁定?或者你只是想在編譯時做到這一點,並能夠在運行時使用對象? – Ben

+0

我希望看看是否存在'tlb',然後使用其中的對象,即需要在運行時決定使用其中的COM對象。我希望避免使用'#import'作爲'tlb',我想這是使用它的標準方式。 – user1173240

+0

正確,但您是否需要使用不同的COM對象稍後創建,或者是編譯時已知的COM對象集合? – Ben

回答

4

類型庫不包含任何代碼,它包含API和對象,函數和其它類型的由API暴露的描述。它可以描述一個標準的DLL及其函數,也可以描述COM對象,其中一些可以直接創建,其他可以從其他函數或對象中獲得。但它只包含說明

一般來說,一個TLB只需要在編譯時,所以編譯器可以知道類型的對象,並生成正確的代碼來調用它們。運行時不再需要它。

以這種方式,類似於一個頭文件。實際上,使用#import實際上會自動生成一個頭文件(查看您的構建目錄以查看它),並且此頭文件是編譯應用程序實際所需的全部內容。因此,類型庫(或多或少)等同於COM DLL的二進制格式頭文件。

在運行時,不需要頭文件,並且也不是類型庫。要有條件地使用對象(取決於它們是否已安裝),可以按照與其他任何DLL基本相同的方式執行此操作。即你看看是否安裝了DLL,如果沒有,你不會嘗試使用DLL代碼。

對於COM對象可以更簡單。嘗試創建其中一個對象,並且如果您使用REGDB_E_CLASSNOTREG失敗,則表示DLL未安裝(或未正確註冊)。