我有一個非託管C++ DLL,它僅僅導出一個類(不是COM ...它只是一個簡單的C++類)作爲它的接口。我想在C#中使用這個類,但被告知它不能僅僅被導入到C#中。在C#應用程序中使用C++類DLL
什麼是在我的C#應用程序中使用這個類的正確方法?
我有一個非託管C++ DLL,它僅僅導出一個類(不是COM ...它只是一個簡單的C++類)作爲它的接口。我想在C#中使用這個類,但被告知它不能僅僅被導入到C#中。在C#應用程序中使用C++類DLL
什麼是在我的C#應用程序中使用這個類的正確方法?
簡單的方法假設類Foo:
然後你讓你的C#代碼依賴於FooWrapper項目/ DLL,並確保非託管LL正確地部署它,如何做到這一點取決於非託管的DLL,但在同一個目錄通常是足夠的。
如果功能不依賴於類的實例,然後更簡單的的P/Invoke
雖然,如果OP處理字符串或異常,我不會調用(5)可選。 – 2009-02-20 13:55:24
你需要一個代理(GoF模式)中介彌合託管/非託管邊界。
兩個選項:
前者會更直接,後者有兩個純粹的C++ - > COM - > .NET。
這個答案對於單個類庫來說可能是過量的,但SWIG是一個很好的解決方案,用於「包裝」C/C++類以供其他語言使用。它適用於C#。
DllImport是你最好的選擇。有一些數據類型按摩,特別是如果你通過結構,但你幾乎可以做任何事情。
有時,提供您自己的C接口更容易。 SWIG是不平凡的設置。我使用託管的C++和C++/CLI,它們都很好。最簡單的就是做一個C封裝器(因爲大多數方法都可以調用C函數,所以可以用於任何其他語言)。
它是一個COM類嗎? – 2009-02-20 13:46:40
對不起,我應該更具體。這不是一個COM類。這只是一個普通的舊C++類。 – cjserio 2009-02-20 13:47:11