2010-06-29 57 views
15

讓我們說我正在訪問第三方庫,文檔指出我可以使用pInvoke或創建一個互操作庫並使用COM。這兩種技術有什麼區別,爲什麼我可以選擇一種呢?pInvoke和COM Interop有什麼區別?

回答

12

P/Invoke用於調用普通的C API(像大多數的Win32 API)。 COM互操作用於調用COM對象。

你可以圍繞一個C API創建一個C++ COM包裝器,然後使用COM互操作來調用你的包裝器,如果API調用的數量相對較高(並且你可以使用COM包裝器將它們封裝爲一個或兩個調用)。這是因爲託管本機互操作性可能相對昂貴,並且最大限度地減少轉換次數是很好的。儘管實際上我會說使用C++/CLI創建包裝可能會對C#方面更友好一些(例如,查看SlimDX,例如,這是圍繞COM API(DirectX)的C++/CLI包裝)。除非你有一個特定的性能問題,否則我只會使用你試圖調用的API更自然的方法:如果它是C API(如Win32 API),那麼使用P/Invoke的。如果它是基於COM的,那麼使用COM互操作。

+0

那麼你是說引擎蓋下,COM interops自己在做pinvokes嗎?這個COM只是一個友好的包裝? – Grant 2010-06-29 05:17:05

+2

不,COM互操作和P/Invoke是不同的,而另一個沒有實現。我在第二段中說的是,如果C API是「chatty」並且需要大量函數調用,那麼可以使用C++中的COM包裝器並從C#中調用* wrapper *來減少managed-本地轉換。我懷疑這是你的圖書館的文檔建議。 – 2010-06-29 05:19:18

3

PInvoke使用動態鏈接機制將外部代碼引入執行過程。動態鏈接庫(DLL)必須與調用應用程序具有相同的目標體系結構,因此無法從64位到32位進行交叉調用,反之亦然。而是將DLL映射到調用者的地址空間並在執行過程中執行。

COM,DCOM,COM +和ActiveX都基於進程間通信庫,但有時可能會轉化爲簡單的DLL加載。 COM鏈接的對象與CORBA對象相關,但並不完全相同,但是當CORBA發展自己的對象定位器時,COM實現仍然鬆散地基於Sun Microsystems RPC和XDR庫,擴展了COM的面向對象功能。 COM對象不是由DLL引用的,而是由用於查找對象類和查詢其接口的GUID引用的。目標代碼通常在單獨的進程中運行,並可能在單獨的服務器上運行。