2010-03-01 44 views
4

我有現有的C++ lib包含許多不同的類一起工作。一些示例用法應該包括像將一個類的實例傳遞給另一個類的構造函數/方法之類的東西。爲複雜的C++類系統創建C#綁定?

我打算爲使用C++/CLI的C++類提供C#綁定,因此我不必移植整個C++代碼。

我已經可以在「Facade」的方式下創建另一個類,它隱藏了用戶在現有C++代碼中使用的所有類。但是,我想要的是提供相同的方法簽名給用戶的類。

有沒有任何指導或建議呢?

ps。我查看了一些現有的開源C#到C++綁定項目。但他們似乎使用了許多不同的方式來做到這一點,而我並不真正瞭解它。

回答

5

很多這將取決於你的類的因式分解。在我所做的工作中,我嘗試將我將模型化的C++類作爲隱藏的實現細節,並將其包裝到適當的C++/CLI類中。大多數情況下,我可以通過使用不特別精細的管理界面來解決這個問題。當你的實現涉及到直接實現底層C++代碼的每個細節時,你最終會得到一個非常「健談」的界面,這將在託管/非託管轉換中涉及相當數量的成本。特別是,如果您的非託管C++類使用stl,尤其是stl集合類型,那麼當您發現通過stl集合進行的每次迭代都涉及多個託管/非託管轉換時,您可能會發現一個不愉快的驚喜。我有一個使用stl的圖像解碼器,因爲這個,它像狗一樣跑。圍繞訪問stl類型的代碼放置#pragmas的明顯修復方法無濟於事。我發現做的工作是將所有這些隱藏在一個基於句柄的C接口中,以將所有C++主題隱藏在鐵幕之後。沒有stl暴露在任何地方意味着它被允許作爲非託管代碼存在。

我認爲你最大的問題將是如何處理集合(如果你使用任何)作爲C++集合的哲學和.NET集合的哲學不匹配。我懷疑你會花費很多時間將適配類的.NET集合映射到你的C++類/類集合。

編輯 Here's a blog article我前一段時間寫過關於這個問題。它使用託管的C++方言,而不是C++/CLI,但問題是相同的。

+0

+1 -STL在我的屁股裏也咬了我一口。 – Simon 2010-03-01 15:25:48

+0

對於STL問題,STL.NET試圖解決的問題不是那麼簡單嗎? (http://msdn.microsoft.com/en-us/library/ms379600%28VS.80%29.aspx) – jalf 2010-03-01 15:39:51

+0

一點也不 - STL.NET是建立在stl設計上的不同容器類。在這個例子中,有一個未知的C++類庫,因爲它是非託管的,根本不能使用STL.NET。該任務仍然是相同的:將STL類型映射到.NET類型,並且如果您的體系結構不考慮託管/非託管轉換,則會造成性能瓶頸。 – plinth 2010-03-01 15:53:40

1

我曾經只使用[DllImport]屬性與C#進行C++綁定。如果你沒有任何STL問題在這裏說過,並且你的lib很簡單(例如作爲一個DLL),我想這是綁定C++和C#的最簡單的方法。

MSDN上的簡單示例:http://msdn.microsoft.com/en-us/library/aa984739(VS.71).aspx

+0

你不明白這個問題的主題。 – Elmue 2014-01-15 04:45:30