為什麼 COM 互操作優先於 .NET 中的 P/Invoke?
在我們的項目中,我們在我們的 asp.net 應用程序中通過 COM 重用了很多 Delphi 程式碼。
像這樣:legacy delphi dll => delphi COM wrapper => .Net interop => asp.net (mvc)
我們在訪問衝突、dll 解除安裝等方面存在一些問題……我現在已經移植了一些以直接通過 P/Invoke 程式碼使用舊版 dll。
當我查看有關 COM 和 P/Invoke 的資源時,人們幾乎總是建議使用 COM。這是為什麼?P/Invoke 沒有以下好處:
- 簽出的程式碼將始終使用正確的 dll,而不是最後註冊的 COM
- 多個版本可以在伺服器上並行執行(例如:DEV、TEST 和 QA)
- 沒有更多的 COM 註冊麻煩
- 比 COM 通信快得多(我讀過的文章表明速度提高了 30%)
PInvoke 是一個非常好的工具,但它肯定不能替代 COM。PInvoke 僅支持具有 C 語法的簡單函式;COM 允許您實現對像模型。以
Microsoft.Office.Interop命名空間中的類為例——它們都是沒有包裝器的純 COM 類。使用 PInvoke 進行 Office 互操作將非常痛苦。PInvoke 的另一個核心問題是,編寫聲明通常是客戶端程序員(最不可能正確處理它們的人)的負擔。COM 作者可以發布自動生成的類型庫,就像 .NET 程序集中的元數據一樣,極大地消除了出錯的可能性,並且客戶端程序員無需在 Project > Add Reference 之外進行任何工作。
解決你的子彈:
- 簽出的程式碼將始終使用正確的 DLL,而不是最後註冊的 COM
您仍然受制於 Windows 的變幻莫測,無法找到正確的 DLL。避免意外的唯一好方法是將DLL與EXE儲存在同一目錄中,這在COM中也很可能;您所要做的就是創建一個名為的空文件
yourapp.exe.local
- 多個版本可以在伺服器上並行執行(例如:DEV、TEST 和 QA)
在 COM 中也不是問題,使用上述技術或使用無註冊清單。
- 沒有更多的 COM 註冊麻煩
使用無註冊清單,因此不需要註冊。做起來很簡單——只需將
Isolated引用的屬性設置為True.
- 比 COM 通信快得多(我讀過的文章表明速度提高了 30%)
它比 COM*慢得多。*通過 ; 進行後期綁定的 COM 呼叫可能會產生額外費用
IDispatch;這與使用反射進行呼叫的成本大致相同。還有第三種實現本機程式碼互操作的方法:用 C++/CLI 語言編寫託管類包裝器。該技術在 .NET 框架中大量使用,特別是在 mscorlib.dll、System.Data 和 PresentationFramework 中,這些程序集對本機程式碼具有很強的依賴性。但是,不太適合 Delphi;它最適合可以從 C 或 C++ 輕鬆呼叫的本機程式碼。