2012-03-05 85 views
3

因此,我試圖使用C++/CLI爲C++和C#之間的互操作性創建一個非託管C++類的C++/CLI包裝,這是必要的,因爲我需要C#應用程序中的幾個C++類實例。如何使用C++/CLI打包C++類

我做它使用PIMPL隱藏的非託管類這樣

http://msdn.microsoft.com/en-us/library/ms235281.aspx

我原以爲,建設該項目將導致的.lib文件中的CLR類庫,但這一切在輸出發佈文件夾是一個DLL。我有點困惑,因爲我導致認爲你不能在C++/CLI中導出類,並且我只是鏈接到CLR類庫項目輸出的.lib文件。我只能假設我已經創建了一個錯誤的項目,但似乎沒有太多關於這種事情的文檔。

謝謝。

回答

3

我過去所做的是非常相似的MSDN文章

創建一個C++類,並確保該CPP文件編譯器選項設置爲「無公共語言運行庫支持」

然後使用pimpl在C++/CLI類中引用此C++類,確保此cpp文件啓用了「Common Language RunTime Support(/ clr)」。

輸出將是您可以在現有.NET代碼中使用的DLL。

從經驗來看,我會確保你在包裝類中創建的接口只有雙精度,int等和不引用任何C++類。

@Bill在一些C#代碼中使用這個包裝器DLL只需使用「Add Reference」添加對DLL的引用。您將能夠按照您的期望調用所有公共函數。

+0

Thanks Alastair – 2012-03-05 14:09:22

+0

'創建一個C++類並確保該cpp文件的編譯器選項設置爲「No Common Language RunTime Support」'如果不能更改此設置會怎麼樣(例如,如果該類在某個項目中不能編輯)? – wil 2014-03-17 03:18:40

3

什麼是輸出是.Net大會,其中包括一些本機代碼。如果你想把你的本地代碼放到一個靜態庫中,然後把它鏈接到這個程序集中,那麼這也可以工作。

但是在一天結束時,如果您想將代碼包含在.Net(c#)應用程序中,那麼它的.Net接口必須駐留在Assembly(.dll)中。

+0

嗨,尼克,感謝您的回覆。 那麼C++/CLI是否需要導出包裝類?我的理解是,您只能使用從DLL導出的項目,但在之前的文章中告訴我,在C++/CLI中沒有導出符號的概念。 – 2012-03-05 13:18:41

+1

你是對的,在C++/CLI中沒有導出符號的概念。組件標題包含所有可用的類型。您可以使用Visual Studio工具中的'ildasm.exe'來檢查組件的內容。我想要注意的是,程序集與傳統的DLL不一樣 - 微軟只是重載了後綴! – Nick 2012-03-05 13:34:36

+0

道歉,如果我是密集的,但澄清,我不明白的是如何在C#應用程序中使用包裝類,如果沒有被導出。 – 2012-03-05 13:46:17