Dot-Net

為什麼 COM 互操作優先於 .NET 中的 P/Invoke?

  • September 7, 2021

在我們的項目中,我們在我們的 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++ 輕鬆呼叫的本機程式碼。

引用自:https://stackoverflow.com/questions/10929164