VC ++(本机)可以用VC#无法完成什么?
从我所知道的唯一值得使用VC ++原生的东西就是当你需要自己管理内存而不是CLR垃圾收集器时,我没有看到任何目的(但那是另一个问题)后来问道。)
答案 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#中执行与在C ++中相同的操作。很多情况下你根本就不想这样,本机解决方案更好。例如,可以通过不安全的代码或IntPtr来管理和操作C#中的内存。它不是那么简单,一般没有理由。
答案 3 :(得分:6)
您无法为其创建设备驱动程序。
答案 4 :(得分:4)
我认为有几个要点:
你可以用C#/ C ++ / Java / Python / Lisp或几乎任何其他语言做任何事情,最后所有这些语言图灵完成;)
......问题是它是否适合你的需求?
事实上,大多数桌面应用程序:Web浏览器,Word处理器,桌面环境本身(如Windows资源管理器,KDE或Gnome)都是用编译语言编写的,仔细考虑资源......否则,它们会变得非常臃肿应用
答案 5 :(得分:3)
尽管在C#中编写shell扩展是可能的,但是几乎不可能为Vista和Windows 7编写shell扩展.Shell扩展和命名空间扩展(以及使用新属性系统的任何其他东西)(kindof)必须是用C ++完成,除非你进入痛苦。
答案 6 :(得分:3)
有两个明显的答案:
然而,系统调用没有问题。 p / invoke允许你用C#做那些,几乎和C ++一样容易。
答案 7 :(得分:2)
答案 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也可以工作)