2009-02-20 65 views
42

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

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

+1

它是一個COM類嗎? – 2009-02-20 13:46:40

+1

對不起,我應該更具體。這不是一個COM類。這只是一個普通的舊C++類。 – cjserio 2009-02-20 13:47:11

回答

43

簡單的方法假設類Foo:

  1. 創建一個C++/CLI項目,調用此FooWrapper。
  2. Make FooWrapper依賴於非託管dll(不過您通常會這樣做)。
  3. 創建託管類ManagedFoo,其中包含類型爲Foo *的單個私有實例字段。
  4. 在ManagedFoo中提供公共包裝函數,該函數將轉發到基礎實例字段。
  5. 任選的(雖然推薦):從.NET成語(字符串等)到C++成語(的std :: string或字符*)
  6. 捕捉非託管異常
    • 轉換參數,並拋出管理的人,而不是

然後你讓你的C#代碼依賴於FooWrapper項目/ DLL,並確保非託管LL正確地部署它,如何做到這一點取決於非託管的DLL,但在同一個目錄通常是足夠的。

如果功能不依賴於類的實例,然後更簡單的的P/Invoke

+0

雖然,如果OP處理字符串或異常,我不會調用(5)可選。 – 2009-02-20 13:55:24

2

你需要一個代理(GoF模式)中介彌合託管/非託管邊界。

兩個選項:

  • A C++/CLI包裝
  • COM包裝。

前者會更直接,後者有兩個純粹的C++ - > COM - > .NET。

8

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

請參閱http://www.swig.org/

3

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

2

有時,提供您自己的C接口更容易。 SWIG是不平凡的設置。我使用託管的C++和C++/CLI,它們都很好。最簡單的就是做一個C封裝器(因爲大多數方法都可以調用C函數,所以可以用於任何其他語言)。