我目前正在开发一个Game项目,因此我正在使用C#开发我的编辑器,因为用C ++需要很多时间,所以为了提高效率我使用C#作为编辑主要语言,以快速获得结果
但是,是否可以在C#中创建一个游戏编辑器来创建可由C ++读取的C#对象,或者在C#中创建可以在C ++中使用的C ++对象的游戏编辑器?
这是因为C#是RAD环境,因此可以快速开发Windows应用程序,但C ++ / DirectX可能是游戏的最佳环境。
有没有办法将两者结合起来,因为它们都是.NET Framework的一部分?
答案 0 :(得分:2)
过去我成功使用C ++ / Cli从C#创建C ++对象。 基本上,您可以创建一个C ++(托管)库来加载/创建c / c ++(非托管)对象。您可以从托管(c#/ vb)库/应用程序中使用此托管库。 请注意以下事项:
COM和p / invoke也是可行的选择。
答案 1 :(得分:1)
C#和C ++之间的通信(或任何托管和非托管语言之间的通信)是一种痛苦,除非你有非常好的理由使用,否则应该避免。
对于通信,您可以使用管道,WCF,COM,P / Invoke和其他一些自定义商业选项。你可以搜索网络。在我工作的引擎中,我们使用由多个进程共享的匿名MemoryStream。
但总是回归问题的是,对于C ++中的任何结构变化,你需要在C#中反映这些变化。就像你更改方法所采用的参数或结构的定义一样。有一些解决方案可以自动“塑造”您的C#以始终与C ++保持同步,但它们实施起来既昂贵又繁重。
现在,为什么你不应该打扰!没错,除了C ++之外,你不会发现高端商业引擎。虚幻? C ++。资源? C ++。孤岛危机? C ++。因为C ++提供了任何托管语言都无法提供的性能。它还允许直接控制存储器并微控制对象的创建和擦除方式。
那么,为什么你不应该在意呢?因为,除非你计划发布刺客信条,半条命或天际的大小或范围的三A游戏,否则XNA框架下的C#将提供充足的空间和性能。远远超过你所需要的。如果您确实遇到了性能问题,那么托管语言很可能不是问题,并且您的代码仍然应该有很多优点。很可能如果你在C#中遇到性能问题,你也可以在C ++中使用它们。
XNA还能够在Windows,Xbox和不同的Microsoft便携式设备上发布。此外,无论如何,将DirectX限制在那些平台上。
答案 2 :(得分:0)
是否可以从C#创建C ++对象?
不直接。首先,我认为您不能使用P / Invoke来调用构造函数。您将始终需要导出特殊的“构造函数包装器”,例如:
extern "C" {
EXPORT_API YourClass* YourClassInstanceFactory()
{
return new YourClass();
}
}
对于随后的thiscall
,您可能需要跟踪所有经过修饰的名称,这些名称在每次编译库时都会更改。
您可以在C ++中创建一个包装器库,该包装器extern
的C帮助器函数将通过C#进行平台调用,但是话又说回来,我不确定这会增加多少开销,我想您可能会担心性能。 >
另一个解决方案可能是创建一个C ++ / CLI(CLR类库)包装器库,该包装器库可以在C#中直接引用。这种方法的优点是您可以像在常规C ++项目中一样引用本机库。