22

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

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

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

4

3 回答 3

26

底线答案是,如果您从不打算在应用程序中使用 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 应用程序做同样的事情充其量是困难的。

于 2009-06-20T17:35:02.670 回答
2

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

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

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

于 2009-06-21T04:05:11.487 回答
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# 可能是更好的语言选择。

于 2014-02-04T22:54:51.447 回答