【发布时间】:2009-04-16 16:39:10
【问题描述】:
在 VC++(本机)中可以完成哪些 VC# 无法完成的事情?
据我所知,唯一值得使用 VC++ native 的事情是当您需要自己管理内存而不是 CLR 垃圾收集器时,我也没有看到这样做的目的(但那是另一个问题后来问)。
【问题讨论】:
标签: c# c++ visual-c++
在 VC++(本机)中可以完成哪些 VC# 无法完成的事情?
据我所知,唯一值得使用 VC++ native 的事情是当您需要自己管理内存而不是 CLR 垃圾收集器时,我也没有看到这样做的目的(但那是另一个问题后来问)。
【问题讨论】:
标签: c# c++ visual-c++
跨平台开发。是的 Mono 存在,并且 Java 的 有点 更可预测,使其在更多平台上的功能完全相同,您可以找到适用于几乎任何平台的 C/C++ 编译器,而 C# 则无法使用.
还链接到第 3 方库,虽然我确信有一种方法可以在 C# 中利用它们,但您将能够利用它们而无需在 C++ 中进行互操作(编组等)。
编辑:最后一件事:可靠的内存管理。是的,您可以使用dispose() 和try-finally,但没有什么比知道内存从堆栈中弹出时消失了。通过 RAII 等技术,当您使用构造良好的类时,您将知道您的类何时释放资源,而不是等待 GC 发生。
【讨论】:
使用 P/Invoke 在 .NET 中不可能几乎没有(最明显的是设备驱动程序)。
还有一些建议是不要使用 .NET(例如,shell 扩展,它会被加载到任何打开文件对话框的进程中1)。
最后,如果可能的话,在 .NET 中有些事情会更加困难(例如,创建一个聚合 FTM 的 COM 组件)。
1 如果该进程已经在使用不同版本的 .NET,这可能会产生问题。随着 .NET 4 能够支持运行时的并行实例,这种情况应该会在未来得到缓解。
【讨论】:
我不确定您说的是语言功能还是应用程序。我的回答是针对应用程序/组件。
确实,只有 2 件事在 C# 中无法做到,而在 C++ 中却可以做到。
这里最值得注意的项目是设备驱动程序。这是一个只接受原生组件的框架,无法插入托管组件。
对于其他任何事情,在 C# 中都可以像在 C++ 中那样做同样的事情。在很多情况下,您根本不想这样做,而本机解决方案更好。例如,可以通过不安全代码或 IntPtr 在 C# 中管理和操作内存。这几乎没有那么容易,而且通常没有理由。
【讨论】:
你不能为一个人编写设备驱动程序。
【讨论】:
我认为有几点很重要:
你可以用 C#/C++/Java/Python/Lisp 或几乎任何其他语言做任何事情,最后它们都图灵完备;)...问题是它适合你的需要吗?
事实上,大多数桌面应用程序:Web 浏览器、文字处理器、桌面环境本身(如 Windows 资源管理器、KDE 或 Gnome)都是用编译语言编写的,并仔细考虑了资源……否则,它们只会变得臃肿不堪应用程序。
【讨论】:
虽然在 C# 中可以在 Windows XP 中编写 shell 扩展,但在 Vista 和 Windows 7 中编写 shell 扩展几乎是不可能的。Shell 扩展和命名空间扩展(以及使用新属性系统的任何其他内容)(kindof)必须是在 C++ 中完成,除非您遇到痛苦。
【讨论】:
有两个明显的答案:
不过,系统调用没有问题。 p/invoke 让您可以使用 C# 执行这些操作,几乎与使用 C++ 一样容易。
【讨论】:
【讨论】:
特别是 C# 和 .NET 一般是自编译吗(这不是巨魔,我真的不知道)?如果没有,您可以使用 VC++ 编写 C# 和 .NET,但不能使用 C# 完成相同的工作。
【讨论】:
这是在开玩笑,但它也是对您的问题的回答……在 VC++ 中,您可以比在 VC# 中更严重地搞砸事情。并不是说你不能在 VC# 中把事情搞砸,但总的来说,你可以在 VC++ 中更轻松、更彻底地搞砸。
再一次,有点开玩笑,但也是对您问题的回答。也许不是您所希望的,但是... :-)
【讨论】:
还有硬实时应用程序。不能使用任何带有 GC 的语言,以防它决定在代码的时间受限部分进行收集。 Java 因甚至不允许您尝试而臭名昭著(因此 EULA 关于不将其用于“旨在用于任何核设施的设计、建造、运营或维护”的软件
(是的,我知道他们已经为实时系统制作了 Java 的修改版本)。
【讨论】:
例如,如果翻译现有库的头文件比放弃现有托管库更难,那么使用 C++ 是有意义的。
【讨论】:
主要区别在于:
C++ 是一种核心语言,您可以使用它构建独立程序。这些程序直接与操作系统通信,而不是其他任何东西。 C++ 编译器几乎适用于所有平台(操作系统)。
C# 是一种符合 CLS 的语言。如果没有 CLI 引擎(.NET Framework、Mono 等),用 C# 编写的程序就无法启动。用 C# 编写的程序与 .NET 框架和操作系统进行通信。你中间有个男人。像所有服务人员一样,这个人可以提供帮助,但会造成额外的麻烦。如果你想移植,中间有一个不同的人等等。并非所有平台都存在 CLI 实现。
在我看来,每一个额外的框架都是额外的问题来源。
【讨论】:
使用 SSE 指令似乎是其中一种情况。一些 .NET 运行时将使用一些 SSE 指令,具体取决于您的代码。但在 VC++ 中,您可以直接使用 SSE 内在函数。因此,如果您正在编写多媒体代码,您可能需要 C++。 (大概 C++/CLI 也可以工作)
【讨论】: