繁体   English   中英

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

[英]What can be done in VC++ (native) that can't be done with VC#?

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

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

跨平台开发。 是单存在,和Java的有些更可预测有它的功能EXACTLY在更多平台上一样,你可以找到几乎任何平台上的C / C ++编译器在那里,在那里你不能用C#。

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

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

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

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

最后,如果可能的话,在.NET中会有更难的事情(例如,创建聚合FTM的COM组件)。

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

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

实际上,在C#中你只能用C ++做两件事。

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

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

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

您无法为其中一个编写设备驱动程序。

我认为有几点重要:

您可以使用C#/ C ++ / Java / Python / Lisp或几乎任何其他语言执行任何操作,最后所有这些语言都可以完成;) ...问题是它是否适合您的需求?

  1. C#有一个很大且极其重要的限制......它只运行一个单独的平台Windows ...(Mono仍然不够成熟 )。
  2. 有许多应用程序,GC只是浪费资源,无法承受你的内存占用1/2的内存,直到下一个gc周期:游戏,数据库,视频auido处理和许多其他关键任务应用程序。
  3. 实时应用程序(再次游戏,视频处理等)。 非确定性GC使他们的生活更加艰难。

事实上,大多数桌面应用程序:Web浏览器,Word处理器,桌面环境本身(如Windows资源管理器,KDE或Gnome)都是用编译语言编写的,仔细考虑资源......否则,它们只会是非常繁琐的应用程序。

虽然在C#中编写shell扩展可以在C#中编写,但几乎不可能为Vista和Windows 7编写shell扩展.Shell扩展和Namespace扩展(以及使用新的Properties系统的任何其他东西)(kindof)必须在C ++中完成除非你感到痛苦

有两个明显的答案:

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

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

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

特别是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也可以工作)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM