是否可以从C#创建C ++对象?

时间:2012-11-12 14:53:33

标签: c# c++ cross-language multiple-languages

我目前正在开发一个Game项目,因此我正在使用C#开发我的编辑器,因为用C ++需要很多时间,所以为了提高效率我使用C#作为编辑主要语言,以快速获得结果

但是,是否可以在C#中创建一个游戏编辑器来创建可由C ++读取的C#对象,或者在C#中创建可以在C ++中使用的C ++对象的游戏编辑器?

这是因为C#是RAD环境,因此可以快速开发Windows应用程序,但C ++ / DirectX可能是游戏的最佳环境。

有没有办法将两者结合起来,因为它们都是.NET Framework的一部分?

3 个答案:

答案 0 :(得分:2)

过去我成功使用C ++ / Cli从C#创建C ++对象。 基本上,您可以创建一个C ++(托管)库来加载/创建c / c ++(非托管)对象。您可以从托管(c#/ vb)库/应用程序中使用此托管库。 请注意以下事项:

  • C ++ / cli只能为特定平台(x86 / x64)构建,因此您需要相应地构建托管编辑器
  • 只要微软不喜欢这种情况,Visual Studio 2012就不支持C ++ / cli的智能感知

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 ++项目中一样引用本机库。