首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 呼叫 C++ 核心庫的實作方案:CLR 托管 C++ 封裝 DLL

     編輯:程式設計綜合問答

專案需求:使用 C# 快速構建 UI 介面,核心邏輯以 C++ 實現。兩者如何高效互通?最佳路徑是 C++/CLI (托管 C++) 封裝非托管 C++ 為 DLL,C# 專案直接引用該 DLL。

架構圖解

+----------------+       +------------------------+       +------------------+
|   C# UI (exe)  | <---> |  C++/CLI Wrapper (dll) | <---> |  Native C++ Lib  |
|  (Managed)     |       |   (Mixed Mode)         |       |  (Unmanaged)     |
+----------------+       +------------------------+       +------------------+

實作步驟

  1. 建立 C++ 靜態/動態庫:核心演算法、資料結構純 C++ 實現 (.lib 或 .dll)。
  2. 新增 CLR 類別庫專案:Visual Studio → CLR Class Library,專案屬性啟用 /clr。
  3. 編寫包裝類別:在 .h/.cpp 中定義 public ref class,內部持有原生指標,提供給 C# 呼叫的方法。
    // Wrapper.h
    #pragma once
    #include "NativeCore.h"
    
    using namespace System;
    
    namespace Wrapper {
        public ref class CoreWrapper {
            NativeCore* _native;
        public:
            CoreWrapper() { _native = new NativeCore(); }
            ~CoreWrapper() { delete _native; }
            int Calculate(int a, int b) { return _native->Calculate(a, b); }
        };
    }
    
  4. C# 專案加入參考:右鍵 References → Add Reference → 選擇編譯好的 Wrapper.dll。
  5. C# 直接呼叫:
    using Wrapper;
    var core = new CoreWrapper();
    int result = core.Calculate(3, 5);
    

關鍵優勢

  • 無縫互操作:C++/CLI 同時支援 managed 與 unmanaged 代碼,無需 P/Invoke 複雜簽名映射。
  • 類型安全:編譯期檢查參數類型,避免執行期崩潰。
  • 記憶體管理:包裝類別實現 IDisposable 或析構函數,確保原生資源釋放。
  • 除錯友好:Visual Studio 支援混合模式除錯,可跨語言單步執行。

注意事項

  • 目標平台一致:C#、Wrapper、Native 必須同為 x86 或 x64。
  • 部署時需攜帶 Wrapper.dll、NativeCore.dll、msvcrxxx.dll 等運行時。
  • 避免在包裝層傳遞複雜 STL 容器,建議轉為陣列或簡單結構體。

此方案在 VS2013/2015/2019/2022 均完美支援,是 C# 與 C++ 混合開發的標準最佳實踐。

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