我应该使用托管 C++还是 C# 适合我的应用程序?
如果您必须在 C# 和托管 C++ 之间做出选择,您会选择哪一个?为什么?
托管 C++ 比 C# 有优势吗?您更喜欢哪种语言?在什么情况下你会做出什么决定?
If you had to decide between C# and Managed C++, which would you choose and why?
Are there benefits of Managed C++ over C#? Which language do you prefer? What decisions would you make under what circumstances?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
如果满足以下条件,我将使用托管 C++:
并且 已经具备一些 C++ 技能,因为上述任务需要经验丰富的 C++ 程序员。大多数时候,如果公司已经有 C++ 代码库,我只会考虑托管 C++,否则谁来维护托管 C++ 代码。
在其他情况下,我总是会选择 C#。即使我选择托管 C++ 作为系统的一部分,我也会尝试用 C# 编写尽可能多的系统。
如果您只需要从 C# 调用一些简单的 API,请参阅 pinvoke.net 和 此概述 了解如何从 C# 调用它们,如几行复杂的 pinvoke 代码 ( C# 中的预构建桥)通常比将 C++ 引入尚未使用它的项目更好。
I would use managed C++ if I:
And already had some skills in C++, as the above tasks will need a experienced C++ programmer. Most of the time I would only consider managed C++ if the company already had a C++ code base, otherwise who is going to maintain the managed C++ code.
In other cases I would always choose C#. Even if I choose managed C++ for part of the system, I would try to write as much of the system as possible in C#.
If you only need to call a few simple APIs from C#, then see pinvoke.net and this overview to find how to call them from C#, as a few lines of complex pinvoke code (prebuilt bridge) in C# is normally better then introducing C++ to a project that is not already using it.
C++.net 对于与 C++ 和 C 代码交互非常有用(即调用外部 C 或 C++ 库,为用 C 或 C++ 编写的外部模块提供回调函数等等。
除了上述情况(与 C 和 C++ 交互)之外,我更喜欢在所有情况下使用 C#。
C# 更容易编写、更简单,并且专门适合使用 .NET 平台。 C++ 也可以做到这一点,但它具有 C++ 语言的所有复杂性以及使用 .NET 平台所需的扩展。
除非您需要与本机 C++ 或 C 代码交互,否则在大多数情况下最好使用 C#(即,如果您正在为 .NET 平台编码)。
通常我更喜欢 C++,但当需要为 .NET 编写代码时,它并不能胜过 C#。
C++.net is useful for interacting with C++ and C code (that is, calling external C or C++ libraries, providing callback functions to external modules written in C or C++ and so on.
I would prefer C# for all situations except the one described above (interacting with C and C++).
C# is easier to write, simpler, and geared specifically to use the .NET platform. C++ can do it also, but it has all the complexity of the C++ language plus the extensions needed to use the .NET platform.
Unless you need to interact with native C++ or C code, you're better off using C# in most cases (that is, if you're coding for the .NET platform).
Normally I prefer C++, but when needing to code for .NET, it doesn't beat C#.
托管 C++ 非常适合与 C++ 进行互操作:例如,如果您有一个 .NET 应用程序,并且您的程序集必须与作为 C++ .lib 文件(我不止一次)提供的本机接口交互,或者与一个不错的 C++ 交互API。
示例:Rithmic(您可能没有听说过它们)直到最近才支持 C++ API。如果您尝试从 C# 访问它们 - 祝您好运;)托管 C++ 允许我访问它们的 API 并公开漂亮的 .NET 对象。
基本上是互操作的。托管 C++ 在与低级 C / C++ API 的互操作方面确实表现出色。
Managed C++ is good for interop with C++: for example, if you have a .NET application and your assembly has to interact with a native interface that comes as C++ .lib files (which I had more than once), or with a nice C++ API.
Example: Rithmic (not that you ever heard of them) until recently ONLY supported a C++ API. If you try to access them from C# - good luck ;) Managed C++ allows me to access their API and expose nice .NET objects.
Basically interop. Managed C++ REALLY shines in interop with low level C / C++ API's.
当我需要构建新的 NET 组件并在其中包含大量 C++ 非托管代码时,我使用了托管 C++。
我做了一个特定的类,用于从旧的 C++ 代码中向前和向后编组一些对象。
I used managed C++ when I needed to build up new NET component with much ofC++ unmanaged code inside.
I did a specific class used to Marshall some objects forward and back from old C++ code.
我遇到了一个问题,该问题在托管 C++ 中是透明的,但在 C# 中却令人头疼 - 我必须将回调函数发送到 C++ 非托管库,该库将此回调定义为 __cdecl。在 C# 中,默认调用约定是 __stdcall,将 C# 委托从 __stdcall 移动到 __cdecl 非常复杂(实际上,它需要“shim”非托管 DLL 才能执行此操作,或者使用一些反射类)。
在 C++(以及 C++.Net)中,它只是一个简单的属性。
I've encountered a problem which was transparent in managed C++, but made a big headache in C# - I had to send a callback function to a C++ unmanaged library, that defined this callback as __cdecl. In C#, the default calling convention is __stdcall, and it is pretty compilcated to move a C# delegate from __stdcall to __cdecl (Actually it requires either a 'shim' unmanaged DLL to do so or using some reflection classes).
In C++, (C++.Net as well), it is just a simple attribute.
我个人没有在托管 C++ 中编写或阅读过太多行代码,但从我所看到的来看,它看起来太复杂且不完整。也就是说,如果您真的很擅长 C++,那么您可能希望使用托管 C++,并且在学习新语言的习惯用法和模式时风险太大。
如果您非常擅长 C#,请使用它。如果您刚刚开始使用 C++ 和 C#,我认为 C# 是更容易选择的途径。
I haven't personally written, or read for that matter, too many lines of code in managed C++, but from what I have seen it looks too convoluted and patchy. That said, you might want to use managed C++ if you are really good in C++, and when learning the idioms and patterns of a new language would be too much of a risk.
Use C# if you are quite competent in it. If you are only getting started with C++ and C#, I think, C# is the easier route to take.
与 C++ 相比,我更喜欢 C#,特别是 .NET,因为它拥有丰富的 .NET 标准库。
I would prefer C#, or specifically .NET, over C++ because of the extensive .NET standard library.