我正在开发一个我不打算使用.NET库或工具开发或部署的C ++项目,这意味着使用Visual Studio Win32控制台应用程序创建它是有意义的。但是,我听说在Visual Studio下使用CLR应用程序时的调试功能要强大得多。所以我有几个问题:
即使您不使用任何.NET库或其他资源,使用CLR应用程序与Win32应用程序是否也能为您的开发过程增加功能?
如果是这样,我是否仍然能够开发/编译项目作为CLR项目来利用这些,即使我正在使用STL等开发纯C ++项目而不利用任何.NET功能?或者这样的项目是否需要基本的差异,这将使回归变得非常重要,这意味着我应该坚持使用Win32控制台应用程序?
答案 0 :(得分:25)
答案是,如果您从不打算在应用程序中使用CLR或任何.Net对象,只需使用普通的Win32 C ++库。做其他事情会让你痛苦不堪。
现在,为了回答有关调试的原始问题,使用CLR进行调试与调试普通C ++应用程序相比具有一定的优势。从Visual Studio 2005开始,C#和VB.Net开始专注于使locals / autos / watch窗口中的变量显示更有价值。它主要是通过引入.Net属性,如DebuggerDisplay,DebuggerTypeProxy和可视化框架来完成的。
如果你不使用任何.Net类型,你将无法获得这些好处。
C ++表达式求值程序不利用其中任何一个。它有自己定制类型显示的方法。但它不像属性样式那样具有特征性(或潜在危险性),因为它不允许代码在debugee过程中运行。
这并不是说调试C ++提供了糟糕的体验。它仅仅是不同的,并且对于许多STL容器类型有更好的显示。
调试CLR应用程序也有一些不满意。例如,调试优化代码有时几乎不可能,因为JITer将隐藏局部变量,参数并且通常是“this”。调试类似构造的C ++应用程序也可能令人沮丧,但你总是可以抓住寄存器并且不知不觉地看看发生了什么。对CLR应用程序执行相同操作很困难。
答案 1 :(得分:2)
我认为将本机C ++代码编译成CLR会打开一大堆蠕虫。除非您对现有C ++代码进行大量投资,并且需要使用托管类型运行代码,否则您需要避免这种情况。
例如,C ++ / CLI是将本机C ++代码直接捆绑到CLR程序集中的一种方法,但C ++ / CLI将非标准语法添加到C ++语言中,并且使用与托管类型混合的本机C ++类型似乎非常棘手问题至少可以说。
因此,总而言之,我会将其保留为原生应用。如果你有计划将它移植到CLR并且你刚刚开始研究这个项目,我会认真考虑开始用C#等CLR本地语言编写。
答案 2 :(得分:1)
CLR控制台应用程序和win32控制台应用程序之间有什么区别? - 前者使用公共语言运行时(换句话说,.NET框架);后者没有。
我无法在win32控制台应用程序模型下使用命名空间System。 - 系统命名空间是.NET框架的一部分。
当我想使用命名空间时,我该怎么办? - 你应该编写一个.NET应用程序。
并且它没有输入提示,例如在C#模型中? - 现有版本的Visual Studio中确实没有适用于C ++ / CLI的IntelliSense。如果您想要.NET应用程序,C#可能是更好的语言选择。