首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# COM 互操作 (二 完):介面查詢三種方式與 COM 參考計數管理建議

     編輯:關於C語言

介面查詢三種方式

  1. COM 包裝類轉型:(IJetEngine)engine 或 engine as IJetEngine。CLR 內部呼叫 QueryInterface,成功返回包裝類,失敗拋異常或回傳 null。as 更安全。
  2. C# 型別轉換語法:同上,但針對 ComImport 介面,即使源介面未聲明繼承目標介面,只要底層 COM 支援 QueryInterface 即可成功。is 運算子同理可用於檢測介面支援性。
  3. 手工聲明 IUnknown 並呼叫 QueryInterface:在介面定義中包含 QueryInterface/AddRef/Release,或繼承 IUnknown。調用時傳入 Guid 取得 IntPtr,再轉包裝類。缺點:易回到指標操作,失去包裝類優勢。

包裝類引用 vs IntPtr 指標

強烈建議使用包裝類引用 (RCW):

  • 介面轉換不產生新物件,引用計數僅在建立 RCW 時 +1。
  • RCW 為受控物件,遵循 GC 生命週期:無引用時被回收,Finalize 時自動 Release 使計數歸零銷毀 COM 物件。
  • 比 C++ ComPtr 更簡潔 (無需手動 AddRef/Release)。

避免直接操作 IntPtr:需手動管理計數,極易洩漏或過早釋放。

自訂介面聲明技巧

僅聲明需要的方法,其他介面參數用 object + [MarshalAs(UnmanagedType.Interface)] 或 IntPtr 佔位,避免遞歸聲明大量介面。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved