2012-01-18 53 views
2

我正在研究在C#中編寫一個DLL,作爲其功能的一部分,它將利用第三方DLL中的方法。如何在C#中使用非託管COM DLL而無需引用

用C++編寫的第三方COM DLL作爲第三方應用程序的一部分在客戶機上註冊。

現在,我可以在我的解決方案中包含(通過引用tlb文件)該DLL並與其進行交互,沒有任何問題。但是,DLL名稱(不是方法簽名等)每年都會更改爲第三方所包含的某些版本控制的一部分。此外,我不能分發第三方DLL(許可證等)。

我基本上想要做的是在我的DLL中使用非託管的COM DLL,而無需在我的解決方案中引用或包含DLL。

而我在尋找的是一些很好的文章/這個具體要求的例子。我已經看到很多使用非託管DLL的文件名,託管COM等,但這些不符合我想要實現的。

即使有人可以給我使用下面的元素,這將是一個偉大的起點,一個基本的例子:

+0

請嘗試http://msdn.microsoft.com/de-de/library/fh1h056h.aspx - 免註冊COM Interop – 2012-01-18 12:58:23

+0

以下是該文章的英文版本:http://msdn.microsoft.com/zh-cn/ -us /庫/ fh1h056h.aspx。我已經遇到過這個,但我們不控制分發或第三方DLL的源代碼。 – Jalalabad 2012-01-18 13:42:47

回答

2

大多數COM服務器支持後期綁定。非常類似於在.NET中使用Reflection。你會使用Type.GetTypeFromProgID()和Activator.CreateInstance(Type)來創建COM對象。首席缺點後期綁定:

  • 你沒有得到智能感知
  • 你讓生產運行時錯誤的任何錯誤,而不是編譯錯誤
  • 它會非常慢
  • C#語法是痛苦的,除非你可以使用C#版本4 動態關鍵字或使用VB.NET封裝器
  • 調試器無法顯示COM對象的屬性。你只會看到一個不透明的__ComObject

但是有利的是,當供應商更新DLL時,您不必重新運行Tlbimp.exe。如果該更新中斷,那麼您將得到運行時錯誤,而不是編譯器診斷。總是很痛苦。

+0

謝謝,這正是我正在尋找的。我嘗試了下面的代碼:'Type ObjectType = System.Type.GetTypeFromProgID(「ThirdPartyDLL.Object」);對象ThirdPartyDLLObject = System.Activator.CreateInstance(ObjectType);'它會按預期生成對象。我通過使用Visual Studio附帶的OLE/COM對象查看器工具來獲得ProgID。 – Jalalabad 2012-01-18 14:23:38

+0

就在旁邊的筆記中,我發現創建的對象類型是「System .___ ComObject」。 – Jalalabad 2012-01-18 14:27:09

1

有在互聯網的許多資源,這blog post應該給你一個很好的起點。

+0

我已閱讀過這樣的文章,但並不完全是我的目標。我們不知道第三方DLL將安裝在哪裏。 – Jalalabad 2012-01-18 14:19:15