非托管 C# 与 C++ [关闭]

Posted

技术标签:

【中文标题】非托管 C# 与 C++ [关闭]【英文标题】:Unmanaged C# versus C++ [closed] 【发布时间】:2013-09-24 02:01:58 【问题描述】:

我想成为一名游戏开发人员,我更喜欢使用 C#。当我问到用 C# 编写实时应用程序的缺点是什么时,我得到了重要的一点:垃圾收集及其对性能可能产生的不可预测的影响。

我的反问是,非托管 C# 呢?它与 C++ 相比(性能方面)如何?它是开发软件的有效选择吗?

我没有听到太多关于非托管 c# 的信息,而且我看到的所有“非托管 c# 与 C++”问题都没有得到解答或回答不准确。这些问题不在堆栈溢出问题上。

编辑:

我相信 umanaged C# 是“不安全的代码”。

【问题讨论】:

哪个平台有非托管 C#?我从来没听说过。 C# 是为 .net 托管环境设计的,除非您正在查看单声道触摸/机器人,否则仍然如此。如果没有这样的平台,那么也许这就是没有太多信息可查的原因。 什么是“非托管 C#”? O_O 我听说过不属于内存管理的 C#(可能还有其他东西)。它允许使用 C++ 风格的指针。通过反编译一些.Net核心功能可以找到一个例子(我认为)。 似乎是不安全模式。不确定影响。 进入浏览器或手机游戏?他们使用统一,没有问题。 IIRC 非托管 C# 意味着您可以使用指针,但这并不意味着不会进行垃圾收集,因此您有 0 个理由这样做。它主要用于为 c 库构建包装器 【参考方案1】:

C# 中的不安全代码不适用于开发单独的应用程序。您可以将不安全代码用于某种时间紧迫的操作,但通常这不是最有效和最方便的方法。恕我直言,它的主要目的是让 C# 有机会与非托管动态链接库和非托管代码集成,所以从我的角度来看,主要原因是集成。

我可以看到托管和非托管代码集成的 3 种常见方式:

    C# 中的Unsafe code 和P/Invoke。在已编译的非托管 DLLs 上构建 C# 包装器。 Managed C++。在现有 C/C++ 代码上构建托管程序集。 COM 互操作。从 .NET 客户端调用 Runtime Callable Wrapper 或从 COM 客户端调用 COM Callable Wrapper。

另一方面,这是您的架构和概念决定:如果您需要完整的内存和性能控制,您可以使用 C++ 甚至纯 C 进行开发。如果您需要现代语言和现代技术的优势和简单性,您可以使用.NET C#。或者您可以同时使用两者,以及如何集成它们。

【讨论】:

不安全的 C# 仅用于集成是不正确的。指针和指针算法存在于 C# 中的原因与它们存在于 C++ 中的原因相同。不幸的是,指针不是“安全的”,即编译器和运行时无法保护您免受诸如悬空指针、缓冲区溢出和内存泄漏等错误的影响,因此编译器要求您同意免责声明:“我知道这是不安全的,但我想要”。 嗯,C# 主要不是为使用指针而开发的。 谁说的?从第一天开始,指针就在 C# 中可用。当然,并非每个项目都需要它们,但例如运算符重载也是如此。你会说 C# 不是主要为运算符重载而开发的吗?也许它不是主要为抽象类开发的?甚至对于结构?也许是泛型?这些在 C# 1.0 中并不存在。 C#主要是为了什么而开发的? 我想说 C# 主要是为 .NET Framework 开发的。 .NET 是一种具有自动内存管理的技术。我认为您在第一条评论中已经回答了这个问题 - 指针不是“安全的”,并且不安全的代码默认情况下是不允许的 在 cmets 中的出色和描述性讨论的答案与它的答案一样多。谢谢:)【参考方案2】:

您可以使用 C# 来构建游戏。问题是你到底打算做什么?您打算针对哪些平台,以及您打算将成品打磨到何种程度?

其他人提到 Unity,它使用 C# 并提供现成的游戏引擎和开发套件。唯一的缺点是免费版有限制。

如果您想构建自己的引擎以便理解,请查看XNA。或者您可以使用 OpenGL 的包装器,例如 SharpGL。或者,也许您可​​以在某个地方找到早已死去的 Managed DirectX。或者,如果您真的很勇敢,您可以使用不安全的代码并包装 GDI 调用,这样您就不必处理极其缓慢的 GDI+ 实现。最后两个真的不推荐,只有 XNA 会为您提供不仅仅是在屏幕上绘制东西的方法。肯定有无数其他可能性,特别是考虑到 C# 开发人员可以使用 Mono。

无论您决定如何,垃圾收集器都不会妨碍您,如果这样做,不安全代码也不会成为解决方案。

编辑: 正如 cdoubleplusgood 所说,XNA 不再处于积极开发中。查看Monogame 并考虑跨平台开发的奇迹。

【讨论】:

MS 已停止进一步开发 XNA。对于一个新项目,我不会推荐它。 @cdoubleplusgood 是的。这还不完全是一种死技术,但我认为推荐具有可预见未来的工具会更好,对吧? :)【参考方案3】:

对于通用应用程序,C#(托管)是一种非常适合的语言,具有出色的性能。除非您有极高的要求,否则您当然可以将其用于游戏。看看 Unity:

Unity

尽管如此,大多数 AAA 游戏工作室都使用 C++ 作为他们的主要编程语言。话虽如此,如果你想在这样的工作室工作,你最好在 C++ 上投入一些精力。

【讨论】:

我对 c++ 比较了解,但我更喜欢 c# 中的特性,例如属性、显式抽象和静态类、属性(喜欢它们)和广泛而简单的框架(可能更多我忘记的东西)。我希望有一种方法可以让我使用 C# 而不会影响性能(或更少)。 尽管我从来没有像使用 C++ 那样自在,但我确实认为 C# 有很多很棒的特性。你有没有在 C# 中尝试过响应式扩展?东西太棒了!它支持真正强大的事件驱动的并行编程。 我必须查一下。谢谢:)

以上是关于非托管 C# 与 C++ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在托管 (C#) 和非托管 (C++) 代码之间来回传递数组内容

让非托管 c++ 代码调用调用 c# 代码的托管 c++ 代码

从非托管 c++ 调用 C# 函数(通过托管包装器)

从非托管 c++ 调用托管 c# 函数

从非托管 c++ 调用托管 c# 函数

C# 托管非托管代码