2009-12-01 168 views
0

我試圖從C#應用程序中使用C++編寫的dll。我有C++ dll(Cyclone物理引擎)的第三方源代碼,不想手動將它移植到C#。在C#中使用C++ dll#

在C++項目
我改變它輸出一個dll。我改變它使用/ clr標誌。我將它改爲使用多線程調試DLL(/ MDd),因爲這是唯一與/ clr兼容且已編譯的。

在C#項目
我添加了對dll的引用。我正在使用旋風命名空間。

起初,在命名空間下沒有任何東西。我認爲這是因爲在C++代碼中,所有的類都聲明瞭沒有訪問修飾符,並且默認是私有的。所以對於類「粒子」我改變了定義:

public class Particle 
{ 
//... 
} 

現在我可以宣佈成功從C#代碼類型的顆粒的變量。然而,intellesense和對象瀏覽器報告Particle是一個結構體(?),它根本不包含任何方法。 C++代碼在「public:」訪問修飾符之後聲明瞭一堆方法,所以我不知道問題是什麼。

例如,

public: 
void integrate(real duration); 

我在做什麼錯?

回答

2

該粒子類不是一個託管類,因此它被視爲一個結構。您需要使用ref關鍵字來進行管理和垃圾收集。您還需要對引用它的每個其他類都這樣做,這可能是一個問題。我認爲最好的解決方案是創建一個在內部使用Particle類的託管包裝類。這個包裝類可以被.net引用。

here

+0

謝謝,保持C#和C++之間的差異對我來說真的很難...... P/Invoke Interop Assistant工具會引用由Caelum能夠自動生成一個包裝?還是有其他工具可以實現這一點? – colithium 2009-12-01 10:18:26

+0

P/Invoke是一種調用未使用/ clr編譯的本地代碼的方式。你仍然不能實例化類,你只能調用函數。另一種方法是讓dll保持原樣並創建一個新的託管C++ dll。這包含一個可管理的api,旨在易於從.net使用。然後實現調用本地dll。你應該很容易在網上找到工作實例。 – 2009-12-01 12:05:14

0

嘗試宣告了C++類ref關鍵字:

public ref class Particle 
+0

245編譯錯誤,當我補充一點,一個小小的關鍵字粒子類...也許這是不可能使用CLR選項,除非它因爲它是專門寫的?我知道這段代碼是作爲一個純粹的C++庫編寫的,沒有任何想法。NET – colithium 2009-12-01 10:08:09

+0

對於這樣的事情,我會創建一個封裝了Particle類的封裝「ParticleBridge」類。保持原始代碼原樣,以便編譯成功,並且在新的ParticleBridge中有一個Particle實例的私有成員,這樣在ParticleBridge上調用的函數將依次調用該Particle的函數。您需要閱讀如何處理來自C++/CLI的託管類型和指針。 – AaronLS 2009-12-01 17:00:55

0

你不得不COM互操作的參考?

+0

我認爲當你指定/ clr標誌時,它與.NET應用程序很好地搭配,你不需要使用Interop。至少這是我在研究如果時收集的。但要回答你的問題:我不這麼認爲 – colithium 2009-12-01 10:05:34

+0

我問的原因是,我用過的大多數C++ dll都使用了COM接口。 – Soppus 2009-12-01 11:56:20

1

我之前並沒有真正遇到過你的確切問題,但我在C#中使用過C++ dll。通常,在調用這樣的dll時,您可以使用dllImport關鍵字。基本上你可以定義一個從C++ dll導入所有類型和方法的類。然後你可以調用這些包裝類。

我遠離它的專家,但我用它來訪問win32方法和我需要使用的一些其他庫。

This codeplex上的鏈接有幾個鏈接工具可能會有所幫助。但最重要的可能是Interop助理。它可以爲您的C++ dll生成C#包裝器。

這不完全是你問的,但我認爲這可能有助於看到不同的方向。

+0

我從來沒有聽說過這個工具,這應該有很大的幫助。我有點希望\ clr標誌是神奇的...: -/ – colithium 2009-12-01 10:14:40