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

C++/CLI 實戰筆記:封裝原生 SDK 為 .NET 組件

     編輯:關於C++

背景

需將原生 C++ SDK 包裝為 .NET 組件供 C# 呼叫。C++/CLI 雖語法醜陋,但比 P/Invoke 互操作簡潔得多,特別適合「原生 → 托管」薄包裝層。

核心語法速查

項目C++/CLI 語法說明
參考型別變數String^ var, array<int>^ arr^ 為追蹤控制碼 (handle),對應 .NET 參考型別
值型別int val無 ^,直接存儲值
枚舉定義public enum class Flag : unsigned int { A=1, B=2 };加 class/struct 才是 .NET 枚舉,可指定底層型別與 [Flags]
原生字串 → .NETString^ s = gcnew String(native_char_ptr);gcnew 分配於受控堆積
.NET 字串 → 原生pin_ptr<const wchar_t> p = PtrToStringChars(str);pin_ptr 釘住記憶體防 GC 移動,轉 wchar_t*
空指標/控制碼nullptr取代 NULL/0,避免裝箱歧義
ref 參數void foo(String^% refStr);% 對應 C# ref
out 參數void foo([Out] String^% outStr);需 [OutAttribute]
陣列建立array<int>^ arr = gcnew array<int>(100);用圓括號非方括號,長度在建構函式傳遞
禁用 const托管型別成員不可用 const/volatile編譯報錯時移除
DllMain 注意勿在 DllMain 執行托管代碼,極易死結可用 #pragma managed(push, off) 區段隔離

實戰心得

  • **薄包裝原則**:C++/CLI 層僅做型別轉換與例外映射,業務邏輯保留在原生 C++ 庫。
  • **資源管理**:原生資源 (指標、句柄) 用 RAII 包裝,在 !ClassName() (Finalizer) 和 ~ClassName() (Dispose) 中釋放,實作 IDisposable。
  • **例外轉換**:捕獲原生例外 (或錯誤碼) 轉為對應 .NET 例外型別 (ArgumentException, IOException 等)。
  • **建置設定**:專案屬性 → 通用語言執行期支援 → /clr (非 /clr:pure,需混合原生代碼)。

結語

C++/CLI 是連接原生與托管世界的強力膠水。掌握上述核心語法與資源管理模式,即可高效產出高品質 .NET 互操作組件。

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