C# 在VC++;(本地)可以';VC做不到?

C# 在VC++;(本地)可以';VC做不到?,c#,c++,visual-c++,C#,C++,Visual C++,在VC++(本机)中可以做哪些不能用VC完成的事情 据我所知,唯一值得使用VC++native的是当您需要自己管理内存而不是CLR垃圾收集器时,我也没有看到这样做的目的(但这是后面要问的另一个问题).您不能为一个设备编写驱动程序。使用p/Invoke,在.NET中几乎没有什么不可能的(最明显的是设备驱动程序) 还有一些建议是不要使用.NET(例如,shell扩展名,它被加载到打开文件对话框1的任何进程中) 最后,如果可能的话,在.NET中还有一些事情要困难得多(例如,创建一个聚合FTM的COM组

在VC++(本机)中可以做哪些不能用VC完成的事情


据我所知,唯一值得使用VC++native的是当您需要自己管理内存而不是CLR垃圾收集器时,我也没有看到这样做的目的(但这是后面要问的另一个问题).

您不能为一个设备编写驱动程序。

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

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

最后,如果可能的话,在.NET中还有一些事情要困难得多(例如,创建一个聚合FTM的COM组件)


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

特别是C#还是.NET一般的自编译(这不是一个巨魔,我真的不知道)?如果不是的话,你可以用VC++写C#和.NET,但你不能用C#做同样的工作。

这是开玩笑,但也是对你问题的回答。。。在VC++中,你可能会比在VC中把事情搞得更糟。并不是说你不能在VC中把事情搞得一团糟,但一般来说,你可以在VC++中更轻松、更彻底地把事情搞得一团糟


再说一次,有点开玩笑,但也是对你问题的回答。也许不是你所希望的,但是…:-)

> P>例如,如果对现有库的头文件进行翻译比放弃现有的托管库更困难,使用C++是有意义的。

< P>而在WindowsXP中编写shell扩展是可能的,在C语言中,为Vista和Windows 7编写shell扩展几乎是不可能的。shell扩展和命名空间扩展(以及使用新属性系统的任何其他)(KoNoF)必须在C++中完成,除非你陷入痛苦。

UL>
  • 内联汇编程序
  • 不能将C++库与类一起使用(P/Invoke只能用于函数AFAIK)
  • 不能对P/Invoke使用回调

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


    在C++中,只有2件事是你不能做的,你可以在C++中做。p>
    • 不能使用C#或任何其他.Net语言为仅接受本机组件的系统编写组件
    • 不能使用C#或任何其他.Net语言更改CLR不允许自定义的CCW的某些属性
    这里最值得注意的是设备驱动程序。这是一个只接受本机组件的框架,无法插入托管组件


    对于其他事物,在C++中也可以做同样的事情,就像C++一样。在很多情况下,您根本不想这样做,而本机解决方案更好。例如,可以通过不安全代码或IntPtr管理和操作C#中的内存。这几乎不那么容易,而且通常没有理由

    跨平台开发。是的,Mono是存在的,Java在更多平台上的功能完全相同,这在某种程度上是可以预测的,你可以找到一个C/C++编译器,适用于几乎任何平台,而你不能使用C#

    还链接到第三方库,我相信在C语言中有一种方法来使用它们,在C++中,如果没有互操作(封送等),您就可以利用它们。
    编辑:最后一件事:可靠的内存管理。是的,您可以使用
    dispose()
    ,然后
    最后再试一次
    ,但没有什么比从堆栈中弹出内存时知道内存已经用完更重要的了。通过RAII等技术,当您使用构造良好的类时,您将知道类何时释放资源,而不是等待GC发生。

    有两个明显的答案:

    • 没有.NET,VC永远无法运行 框架本地C++可以。那可能 在某些领域(其他领域)是必要的 已经提到了设备驱动程序,但是 更常见的例子可能是 使用.NET framework的客户端 没有安装。也许你是 分发应用程序和 知道不是所有的客户都是 愿意安装.NET,所以您的 如果你制作了一个应用程序,销售额会上升 这在没有压力的情况下奏效了 对.NET的依赖。或者,您可能 在某些移动设备上工作 所占用的数兆字节 无法证明.NET CF是合理的。或shell扩展,在这些扩展中,使用.NET可能会给用户带来严重的问题
    • 和VC++绝不能使用C++语言 特性。本机C++可以。 当然,C++也可以,但那是一个 不同的问题。有或不信,可以在C++中做得更方便或更优雅的事情。如果你在C++中编程,它们只能访问。

    系统调用没有问题,P/Unjk让你从C++中做到这些,几乎可以从C++中做到。

    < P>还有硬实时应用程序。任何一种GC都不能使用,只是为了在代码的时间限制部分收集。java甚至不允许你尝试。(因此,EULA禁止将其用于“用于任何核设施的设计、建造、运行或维护”的软件)


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

    我认为有几个要点:

    你可以用C#/C++/Java/Python/Lisp或几乎任何其他语言做任何事情,最后它们都是图灵完成的
    …问题是它适合你的需要吗

  • C#有一个非常重要的限制,它只运行