VC ++(本机)可以用VC#做什么?

时间:2009-04-16 16:39:11

标签: c# c++ visual-c++

VC ++(本机)可以用VC#无法完成什么?

从我所知道的唯一值得使用VC ++原生的东西就是当你需要自己管理内存而不是CLR垃圾收集器时,我没有看到任何目的(但那是另一个问题)后来问道。)

14 个答案:

答案 0 :(得分:13)

跨平台开发。是Mono存在,并且Java的有点更可预测它在更多平台上的功能完全相同,你可以找到几乎任何平台的C / C ++编译器,你不能用C#

还链接到第三方库,虽然我确信有一种方法可以在C#中利用它们,但你可以在C ++中没有互操作(Marshaling等)的情况下利用它们。

编辑:最后一件事:可靠的内存管理。是的,你可以使用dispose()try-finally,但没有什么比知道当它从堆栈弹出时内存消失一样。通过像RAII这样的技术,当你使用构造良好的类时,你会知道你的类何时释放资源,而不是等待GC发生。

答案 1 :(得分:8)

使用P / Invoke,.NET中几乎没有不可能(最明显的是设备驱动程序)。

还有一些建议是不使用.NET (例如shell扩展,它被加载到打开文件对话 1 的任何进程中。)< / p>

最后,如果可能的话,.NET中的内容会更加困难(例如,创建聚合FTM的COM组件)。

1 如果该进程已使用不同版本的.NET,则会产生问题。这将在以后得到缓解,.NET 4能够支持运行时的并排实例。

答案 2 :(得分:7)

我不确定您是在谈论语言功能还是应用程序。我的答案是应用程序/组件。

在C ++中,你只能用C ++做两件事。

  • 您不能使用C#或任何其他.Net语言为仅接受本机组件的系统编写组件
  • 您不能使用C#或任何其他.Net语言来更改CLR不允许自定义的CCW的某些属性

这里最值得注意的项目是设备驱动程序。这是一个只接受本机组件的框架,无法插入托管组件。

对于其他所有事情,可以在C#中执行与在C ++中相同的操作。很多情况下你根本就不想这样,本机解决方案更好。例如,可以通过不安全的代码或IntPtr来管理和操作C#中的内存。它不是那么简单,一般没有理由。

答案 3 :(得分:6)

您无法为其创建设备驱动程序。

答案 4 :(得分:4)

我认为有几个要点:

你可以用C#/ C ++ / Java / Python / Lisp或几乎任何其他语言做任何事情,最后所有这些语言图灵完成;) ......问题是它是否适合你的需求?

  1. C#有一个和极其重要的限制......它只运行一个单一平台Windows ...(Mono仍然不是mature enough )。
  2. 有许多应用程序,GC只是浪费资源,无法承受你的内存占用1/2的内存,直到下一个gc周期:游戏,数据库,视频auido处理和许多其他关键任务应用程序。
  3. 实时应用程序(再次游戏,视频处理等)。非确定性GC使他们的生活更加艰难。
  4. 事实上,大多数桌面应用程序:Web浏览器,Word处理器,桌面环境本身(如Windows资源管理器,KDE或Gnome)都是用编译语言编写的,仔细考虑资源......否则,它们会变得非常臃肿应用

答案 5 :(得分:3)

尽管在C#中编写shell扩展是可能的,但是几乎不可能为Vista和Windows 7编写shell扩展.Shell扩展和命名空间扩展(以及使用新属性系统的任何其他东西)(kindof)必须是用C ++完成,除非你进入痛苦

答案 6 :(得分:3)

有两个明显的答案:

  • VC#永远不能在没有.NET的情况下运行 框架。原生C ++可以。那可能 在某些领域是必要的(其他领域 提到了设备驱动程序,但是 更常见的例子可能只是 .NET框架所在的客户端 未安装。也许你是 分发应用程序和你 并不是所有客户都知道 愿意安装.NET,所以你的 如果你做了一个应用程序,销量会上升 只是没有的工作 依赖于.NET。或者也许你是 在某些移动设备上工作 占用的几兆字节 .NET CF无法证明其合理性。或者使用.NET的shell扩展可能会给用户带来麻烦的问题。
  • VC#永远不会使用C ++语言 特征。原生C ++可以。 (管理 当然,C ++也可以,但那是一个 不同的问题)。无论信不信,在C ++中可以更方便或更优雅地完成这些事情。只有在用C ++编程时才能访问它们。

然而,系统调用没有问题。 p / invoke允许你用C#做那些,几乎和C ++一样容易。

答案 7 :(得分:2)

  • 内联汇编程序
  • 你不能使用C ++ - 带有类的库(P / Invoke只能用于函数AFAIK)
  • 您不能在P / Invoke中使用回调。

答案 8 :(得分:1)

特别是C#和.NET一般自编译(这不是一个巨魔,我真的不知道)?如果没有,您可以使用VC ++编写C#和.NET,但不能使用C#执行相同的工作。

答案 9 :(得分:1)

这是舌头的问题,但它也是你问题的答案......你可以在VC ++中把事情搞砸得比在VC#中更严重。并不是说你无法在VC#中严重搞砸,但总的来说,你可以在VC ++中更容易,更彻底地搞砸它们。

再次,脸上的舌头,但也回答你的问题。也许不是你所希望的,但......: - )

答案 10 :(得分:1)

还有硬实时应用程序。任何具有GC的语言都不能使用,以防万一它决定在代码的时间限制部分收集。 Java因为甚至不允许您尝试而臭名昭着(因此EULA不会将其用于“用于任何核设施的设计,建造,运营或维护的软件”

(是的,我知道他们已经为实时系统制作了Java的修改版本。)

答案 11 :(得分:0)

例如,如果翻译现有库的头文件比放弃现有的托管库更难,那么使用C ++是有意义的。

答案 12 :(得分:0)

主要区别是:

  • C ++是一种核心语言,您可以使用它构建独立程序。这些程序直接与操作系统通信,而不是其他任何内容。 C ++编译器或多或少存在于所有平台(操作系统)中。

  • C#是一种符合CLS的语言。如果没有CLI引擎(.NET Framework,Mono等),用C#编写的程序就无法启动。用C#编写的程序与.NET框架和操作系统进行通信。你中间有个男人。像所有维修人员一样,这个人可以提供帮助,但会造成额外的麻烦。如果您想要移植,那么中间就有一个不同的人等。所有平台都不存在CLI实现。

根据我的观点,每个额外的框架都是问题的另一个来源。

答案 13 :(得分:0)

使用SSE指令似乎是这些情况之一。某些.NET运行时将使用一些SSE指令,具体取决于您的代码。但在VC ++中,您可以直接使用SSE内在函数。所以,如果您正在编写多媒体代码,那么您可能需要C ++。 (可能是C ++ / CLI也可以工作)