2012-11-12 37 views
2

我目前正在開發一個遊戲項目,所以我在C#中開發我的編輯器,因爲它需要很長時間才能在C++中完成,所以爲了提高效率,我使用C#作爲編輯器的主要語言,以便快速獲得結果。是否可以從C#創建C++對象?

但是,是否有可能在C#中創建一個可用C++讀取的C#對象的遊戲編輯器,或者C#中的遊戲編輯器創建可用於C++的C++對象?

這是因爲C#是一個RAD環境,它的快速開發Windows應用程序,但C++/DirectX是可能是一個遊戲的最佳環境。

有什麼辦法可以將兩者結合起來,因爲它們都是.NET Framework的一部分?

+0

你在找[COM objects](http://www.csharphelp.com/2006/08/building-com-objects-in-c/)嗎? –

+2

告訴我你的引擎應該用C++的原因。普通C++不是.NET Framework的一部分。如果您引用託管C++,那麼它與C#相同,但是使用C++語法。 – LightStriker

+0

我想你並不需要直接從你的編輯器傳遞對象到你的遊戲引擎。相反,您可能想要將在編輯器中創建的對象保存到文件中,然後能夠從C++代碼中讀取對象。爲此,JSON或XML應該是有用的。 – piokuc

回答

1

C#和C++(或任何託管和非託管語言之間)之間的通信是一個痛苦的屁股,除非你有非常非常好的理由使用,應儘量避免。

進行通信,可以用管道,WCF,COM,P/Invoke的和其他一些定製的商業選擇。你可以在網上搜索。在我工作的引擎中,我們使用由多個進程共享的匿名MemoryStream。

但是總會回來的一個問題是,在C++的任何結構變化,你需要反思那些在C#。就像如果你改變一個方法所採用的param或者一個結構的定義一樣。有一些解決方案可以自動「模擬」C#,使其始終與C++保持同步,但實施起來非常昂貴且繁重。

現在,爲什麼你不應該打擾!誠然,你不會找到高於C++的高端商業引擎。虛幻? C++。資源? C++。孤島危機? C++。因爲C++提供了任何託管語言無法提供的性能。它還允許直接控制對象的創建和刪除的內存和微控制。

那麼,爲什麼你不應該在意?因爲,除非你計劃發佈三重A遊戲的規模或範圍的刺客信條,半條命或天際,XNA框架下的C#將提供充足的空間和性能。遠遠超過你應該需要的。如果實際上存在性能問題,那麼託管語言不是問題,並且應該還有大量的優化工作需要完成。如果你在C#中遇到性能問題,那麼你可能會在C++中擁有它們。

XNA還可以在Windows,Xbox和不同的Microsoft便攜式設備上發貨。除此之外,採取DirectX限制你到那些平臺無論如何。

+0

C++/CLI修復了所有這些問題。它識別.NET類型,並識別C++類型。它使用每個(.NET元數據和C++頭文件)的本地描述。沒有額外的工作來保持兩個環境同步。哎呀,即使是「C++託管擴展」(舊的,buggy,現在不支持,所以不使用它)處理這個問題。 –

+0

@BenVoigt:所以,你告訴我,我把一個非託管的C++解決方案放在與託管C++解決方案相同的項目中。在託管的C++中,我可以直接創建非託管C++對象,並且可以進行任何翻譯? – LightStriker

+0

是的。你所做的只是'#include'非託管C++類型的頭文件,並與靜態庫鏈接。就像你會處理另一個非託管的C++項目一樣。 –

0

在過去,我成功地使用C++/Cli從C#創建C++對象。 基本上,您可以創建一個加載/創建c/C++(非託管)對象的C++(託管)庫。您可以使用託管(c#/ vb)庫/應用程序中的託管庫。 要注意以下問題:

  • C++/CLI只能建立針對特定平臺(X86/X64),所以你需要建立自己的管理編輯相應
  • 的Visual Studio 2012不支持智能感知對於C++/cli只要微軟不太喜歡這種場景這麼多

COM和p/invoke也是可行的選擇。