簡體   English   中英

在C#應用程序中使用C ++類DLL

[英]Using C++ Class DLL in C# Application

我有一個非托管的C ++ DLL,它只導出一個類(不是COM ......它只是一個簡單的C ++類)作為它的接口。 我想在C#中使用這個類,但我被告知它不能僅僅導入到C#中。

在我的C#應用​​程序中使用此類的正確方法是什么?

假設類Foo的簡單方法:

  1. 創建一個C ++ / CLI項目,調用此FooWrapper。
  2. 使FooWrapper依賴於非托管dll(不過你通常會這樣做)。
  3. 創建一個托管類ManagedFoo,它包含一個類型為Foo *的私有實例字段。
  4. 在ManagedFoo中提供公共包裝函數,該函數轉發到底層實例字段。
  5. 可選(盡管推薦):
    • 將.net慣用語(字符串等)中的參數轉換為C ++習語(std :: string或char *)
    • 捕獲非托管異常並轉而使用托管異常

然后你使你的c#代碼依賴於FooWrapper項目/ dll,並確保非托管dll與它一起正確部署,如何完成取決於非托管dll,但在同一目錄中通常就足夠了。

如果函數不依賴於類的實例,則更簡單的是P / Invoke

對於單個類庫,這個答案可能有點過分,但SWIG是一個很好的解決方案,用於“包裝”C / C ++類以供其他語言使用。 它適用於C#。

看到 http://www.swig.org/

DllImport是你最好的選擇。 有一些數據類型按摩,特別是如果你傳遞結構,但你幾乎可以做任何事情。

您需要一個代理(GoF模式)中介來橋接托管/非托管邊界。

兩種選擇:

  • C ++ / CLI包裝器
  • 一個COM包裝器。

前者會更直接,后者有兩個步驟純C ++ - > COM - > .NET。

有時,提供自己的C接口更容易。 SWIG非常容易設置。 我使用托管C ++和C ++ / CLI,他們很好。 最簡單的只是做一個C包裝器(並且可以被任何其他語言使用,因為大多數人都有辦法調用C函數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM