【问题标题】:Win32 Console app vs. CLR Console appWin32 控制台应用程序与 CLR 控制台应用程序
【发布时间】:2010-11-04 13:22:55
【问题描述】:

我正在处理一个我不打算使用 .NET 库或工具开发或部署的 C++ 项目,这意味着我可以使用 Visual Studio Win32 控制台应用程序创建它。但是,我听说在 Visual Studio 下使用 CLR 应用程序时的调试能力要强大得多。所以我有几个问题:

  1. 即使您不使用任何 .NET 库或其他资源,CLR 应用程序与 Win32 应用程序是否确实会为您的开发过程增加功能?

  2. 如果是这样,我是否仍然能够将项目开发/编译为 CLR 项目以利用这些优势,即使我正在使用 STL 等开发纯 C++ 项目并且没有利用任何.NET 功能?或者这样的项目是否需要根本性的差异,以使恢复变得不那么简单,这意味着我应该坚持使用 Win32 控制台应用程序?

【问题讨论】:

    标签: .net c++ visual-studio debugging console-application


    【解决方案1】:

    此答案从此处复制 - http://social.msdn.microsoft.com/Forums/vstudio/en-US/895ecb47-8b34-4a1a-a20b-fda1e5e576eb/whats-the-difference-between-clr-console-application-and-win32-console-application

    CLR 控制台应用程序和 win32 控制台应用程序有什么区别? - 前者使用公共语言运行时(即 .NET 框架);后者没有。

    我无法在 win32 控制台应用程序模型下使用命名空间系统。 - 系统命名空间是 .NET 框架的一部分。

    当我想使用命名空间时应该怎么做? - 您应该编写一个 .NET 应用程序。

    它没有像 C# 模型那样的输入提示吗? - 在 Visual Studio 的现有版本中确实没有 C++/CLI 的 IntelliSense。如果您想要一个 .NET 应用程序,C# 可能是更好的语言选择。

    【讨论】:

      【解决方案2】:

      我认为将本机 C++ 代码编译到 CLR 中会带来一大堆蠕虫。除非您对现有 C++ 代码进行大量投资并且有必要使用托管类型运行代码,否则这是您想要避免的事情。

      例如,C++/CLI 是将本机 C++ 代码直接捆绑到 CLR 程序集中的一种方法,但 C++/CLI 向 C++ 语言添加了非标准语法,并且将本机 C++ 类型与托管类型混合使用似乎非常棘手至少可以说的问题。

      因此,总而言之,我会将其保留为原生应用程序。如果你有任何将它移植到 CLR 的计划并且你刚刚开始从事这个项目,我会认真考虑开始使用 C# 等 CLR 原生语言编写。

      【讨论】:

        【解决方案3】:

        最重要的答案是,如果您从不打算在应用程序中使用 CLR 或任何 .Net 对象,只需使用普通的 Win32 C++ 库。做任何其他事情都会让你在路上痛苦。

        现在,要回答有关调试的原始问题,是的,使用 CLR 进行调试比调试普通 C++ 应用程序具有某些优势。从 Visual Studio 2005 开始,C# 和 VB.Net 都开始专注于使 locals/autos/watch 窗口中的变量显示更有价值。主要是通过引入 .Net 属性如 DebuggerDisplay、DebuggerTypeProxy 和可视化框架来完成的。

        如果您不使用任何 .Net 类型,您将不会获得这些好处。

        C++ 表达式求值器不利用其中任何一个。它有自己的自定义类型显示的方法。但它不像属性样式那样有特色(或潜在危险),因为它不允许代码在被调试进程中运行。

        这并不是说调试 C++ 提供了糟糕的体验。它只是不同,对于许多 STL 容器类型有更好的显示。

        调试 CLR 应用程序也有一些缺点。例如,调试优化代码有时几乎是不可能的,因为 JITer 会隐藏局部变量、参数,并且通常会隐藏“this”。调试一个类似构造的 C++ 应用程序也可能令人沮丧,但您总是可以抓住寄存器并拆开看看发生了什么。为 CLR 应用程序做同样的事情充其量是困难的。

        【讨论】:

        • 非常感谢您的详细解答!我想知道您是否可以详细说明您的第一个陈述并解释这种设置可能长期面临哪些问题?这主要是因为无意中使用了 .NET 对象/功能,让它们编译得很好,然后不得不更改这些代码的这些部分,这些部分深深嵌入到应用程序中?
        • @bsofman,基本上是的。为了同时利用 CLR 并在没有 CLR 的情况下进行部署,您需要 2 个构建配置(每个一个)。语言之间的差异会出现在一个配置中的构建错误中,但不会出现在另一个配置中,并且最终会相当烦人
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-22
        • 2015-10-19
        • 2013-07-09
        相关资源
        最近更新 更多