2013-03-12 74 views
0

例如,IWebBrowser2基本上是最初爲IE設計的COM接口。但是在Microsoft.ShDocVw.dll的.NET中定義了相同的接口,可以直接在.NET程序中使用它。對於類型如IUnknown,IInternetSecurityManager,IObjectSafety,IObjectWithSite等,是否有一個彙編程序可以導出.NET接口。我不想重新定義程序中的現有接口。如果我這樣做,他們將來可能會引發衝突。如何確定是否存在由Microsoft定義的用於現有Microsoft COM接口的.NET接口

所以,問題是,微軟的.NET程序集定義了這些COM接口?

+1

我很確定任何已正確註冊的COM對象都可以在.NET下使用...... – Goz 2013-03-12 18:14:06

+0

MSDN .NET函數引用似乎沒有.NET版本的IUnknown。 – dattebayo 2013-03-12 18:21:46

+0

實際上無法在.NET中定義IUnknown。根據您使用[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)],[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]還是[InterfaceType(ComInterfaceType.InterfaceIsDual)],您在.NET中定義的每個接口都根據IUnknown或IDispatch派生。 關於你的其他查詢 - 我沒有一個MSDN參考,因爲我多年前瞭解這個東西,這不是你真的需要引用回。我可能會發現一些信息並將其發回。 – 2013-03-12 18:52:42

回答

0

COM接口的大多數消費者,包括Microsoft代碼在內,都定義了他們自己對這些接口的私有定義。既然他們是私人的,即使你想要,你也不能使用他們。只要你自己沒有實現接口,那麼就永遠不會造成任何衝突或問題。如果你自己實現了一個COM接口,並且你期望你將從.NET代碼中被調用,那麼你只需要使用與調用者使用的接口相同的定義。

+0

有沒有一個MSDN博客談這個? – dattebayo 2013-03-12 18:23:40

+0

http://msdn.microsoft.com/en-us/library/aa645712(v=vs.71).aspx可能是一個很好的開始 – Joel 2013-03-12 19:02:45

+0

另請參見:http://www.devx.com/dotnet/文章/ 42590如果您使用VS2010或2012 – Joel 2013-03-12 19:04:40

3

但是同樣的接口在.NET

定義它是在.NET不定義。你通過添加對shdocvw.dll的引用來獲得它。 Visual Studio讀取嵌入在該DLL中的類型庫並從中生成interop庫。 Tlbimp.exe的作用與此相同。這是COM互操作如何在基本級別上工作。

一些 COM接口類型已在.NET框架程序集中聲明,其中大多數在System.Runtime.InteropServices.ComTypes命名空間中。 .NET本身需要完成的東西非常基本。它們記錄在MSDN中,因此它不需要但是快速的MSDN搜索來找回它們。還有一些是內部,只是在那裏使.NET包裝類工作,你只能用Reference Source或反編譯器找回它們。除了複製/粘貼之外,其他用處不大

自己聲明COM接口類型是一個危險的冒險,應該始終避免。小錯誤會導致運行時錯誤非常難以診斷並且很難診斷。或者沒有錯誤,最糟糕的一種。當你有一個類型庫時,總是喜歡導入一個類型庫,就像你使用shdocvw.dll一樣。類型庫旨在避免錯誤。如果您沒有類型庫,那麼Google搜索代碼是下一個最佳選擇。然後當然在問這個問題。

+0

我可以在僅顯示.NET IL的ILDasm.exe中打開SHDocVW.dll。這是否意味着,ILDasm正在從SHDocVW.dll讀取類型庫導出並生成一個IL代碼? – dattebayo 2013-03-12 19:03:23

+1

這是不可能的,c:\ windows \ system32 \ shdocvw.dll是一個純粹的非託管DLL。 Ildasm.exe會抱怨它沒有有效的CLR標頭。你interop.shdocvw.dll打開,互操作的圖書館,這是自動生成的從類型庫。沒有代碼,只有聲明。與類型庫中的聲明完全相同,但轉換爲.NET元數據格式。 – 2013-03-12 19:06:00

+0

所以,這本機庫定義的IUnknown接口? – dattebayo 2013-03-12 19:31:57

相關問題