讓我們說我正在訪問第三方庫,文檔指出我可以使用pInvoke或創建一個互操作庫並使用COM。這兩種技術有什麼區別,爲什麼我可以選擇一種呢?pInvoke和COM Interop有什麼區別?
15
A
回答
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互操作。
3
PInvoke使用動態鏈接機制將外部代碼引入執行過程。動態鏈接庫(DLL)必須與調用應用程序具有相同的目標體系結構,因此無法從64位到32位進行交叉調用,反之亦然。而是將DLL映射到調用者的地址空間並在執行過程中執行。
COM,DCOM,COM +和ActiveX都基於進程間通信庫,但有時可能會轉化爲簡單的DLL加載。 COM鏈接的對象與CORBA對象相關,但並不完全相同,但是當CORBA發展自己的對象定位器時,COM實現仍然鬆散地基於Sun Microsystems RPC和XDR庫,擴展了COM的面向對象功能。 COM對象不是由DLL引用的,而是由用於查找對象類和查詢其接口的GUID引用的。目標代碼通常在單獨的進程中運行,並可能在單獨的服務器上運行。
相關問題
- 1. AxInterop和Interop有什麼區別?
- 2. setforegroundwindow setactivewindow有什麼區別(pinvoke)?
- 3. COM中IDispatch和IUnkown有什麼區別?
- 4. Win32 API和COM API有什麼區別?
- 5. COM DLL服務器和COM EXE服務器有什麼區別?
- 6. 輸入www。[site] .com和[site] .com有什麼區別?
- 7. Interop和RCW(Runtime Callable Wrapper)之間有什麼區別?
- 8. 有什麼區別`和$(Bash中有什麼區別?
- 9. COM DLL和VC++ MFC DLL有什麼區別?
- 10. COM字符串(BSTR)和.NET字符串有什麼區別?
- 11. 有什麼區別? :和||
- 12. &&和||有什麼區別?
- 13. 「/」和「/ *」有什麼區別?
- 14. 有什麼區別:。!和:r!?
- 15. ==和===有什麼區別?
- 16. Appender和〜有什麼區別?
- 17. $ @和$ *有什麼區別?
- 18. is和=有什麼區別?
- 19. #.00和#。##有什麼區別?
- 20. `==`和`is`有什麼區別?
- 21. '=='和'==='有什麼區別?
- 22. /和/#/有什麼區別?
- 23. | 0和~~有什麼區別?
- 24. `&`和`ref`有什麼區別?
- 25. ==和===有什麼區別?
- 26. ==和===有什麼區別?
- 27. `{}`和`[]`有什麼區別?
- 28. JavaScript和=== ===有什麼區別?
- 29. difftime和' - '有什麼區別?
- 30. =和==有什麼區別?
那麼你是說引擎蓋下,COM interops自己在做pinvokes嗎?這個COM只是一個友好的包裝? – Grant 2010-06-29 05:17:05
不,COM互操作和P/Invoke是不同的,而另一個沒有實現。我在第二段中說的是,如果C API是「chatty」並且需要大量函數調用,那麼可以使用C++中的COM包裝器並從C#中調用* wrapper *來減少managed-本地轉換。我懷疑這是你的圖書館的文檔建議。 – 2010-06-29 05:19:18