我刚开始我的第一个C++项目。我正在使用Visual Studio 2008。这是一个单窗体Windows应用程序,它访问了一些数据库并启动了WebSphere MQ交易。我基本上了解了ATL、MFC、Win32(实际上还有点模糊)和CLR之间的区别,但我不知道该如何选择。
其中一个或多个只是为向后兼容而存在吗?
任何建议都会受到赞赏。
编辑: 我选择了C++用于此项目,但原因我在帖子中没有详细说明,这些原因并非完全技术性的。所以,假设C++是唯一/最佳选择,我应该选择哪个呢?
我刚开始我的第一个C++项目。我正在使用Visual Studio 2008。这是一个单窗体Windows应用程序,它访问了一些数据库并启动了WebSphere MQ交易。我基本上了解了ATL、MFC、Win32(实际上还有点模糊)和CLR之间的区别,但我不知道该如何选择。
其中一个或多个只是为向后兼容而存在吗?
任何建议都会受到赞赏。
编辑: 我选择了C++用于此项目,但原因我在帖子中没有详细说明,这些原因并非完全技术性的。所以,假设C++是唯一/最佳选择,我应该选择哪个呢?
这要看你的需求。
使用CLR会为您提供最丰富的库(整个.NET框架),但代价是限制了您的可执行文件在运行时需要安装.NET框架,并且限制您只能在Windows平台上运行(不过,所有列出的4种技术都只适用于Windows,因此平台限制可能是最不麻烦的)。
然而,CLR要求您使用C++/CLI扩展C++语言,因此您需要学习一些额外的语言特性才能使用它。这样做可以为您提供许多“额外”的功能,例如访问.net库、完整的垃圾收集等。
在ATL和MFC之间进行选择有些棘手。我建议您参考MSDN的选择页面来决定。 ATL/MFC的好处是,您不需要.NET框架,只需要安装VC/MFC运行库即可部署。
直接使用Win32提供了最小的可执行文件,最少的依赖关系,但编写工作量更大。您拥有最少的辅助库,因此需要编写更多的代码。
Win32是一种原始的、裸机的实现方式。它很繁琐,难以使用,有很多细节需要记住,否则事情会以相对神秘的方式失败。
MFC在Win32的基础上提供了一种面向对象的构建应用程序的方式。它不是Win32的替代品,而是一种增强——它为你做了许多艰苦的工作。
System.Windows.Forms(我想你指的是CLR)完全不同,但与MFC的基本结构有很大的相似之处。它是迄今为止最容易使用的,但需要.NET框架,这可能或可能不是一个妨碍。
我的建议:如果你需要避免.NET,那么使用MFC,否则使用.NET(事实上,在这种情况下,我会使用C#,因为它更容易使用)。
就C++而言,我会使用WTL。它是轻量级的,你几乎不需要依赖项(如果有的话也很少),使得它易于分发和安装。当我的应用程序只包含一个 EXE 文件并可以在大多数 Windows 版本上运行时,我觉得非常满意,但这可能不是你关心的问题。
如果你选择使用 .NET,则几乎肯定应该使用 C#。
这里有更多关于 WTL 的信息:
CLR没有问题。像其他人一样,我建议使用C#,但如果您有坚持使用C++的理由,则使用.NET框架比与ATL/MFC搞在一起要容易几千倍(依我之见)。
值得一提的是,如果您正在使用C++/CLR,则实际上并未真正使用C++。C++/CLR编译成CIL,就像C#一样。我自己从未使用过它,但我相信它的目的是允许您编译遗留代码,并使其轻松地可用于新的.NET代码,而不是允许新代码与旧的C++可执行文件一起工作。还有其他调用本机代码的.NET方法,也许您应该探索一下。
2021年的现代答案似乎是使用C++/WinRT而不是C++/CLR(或C++/CLI或C++/CX...天哪,微软):
https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/intro-to-using-cpp-with-winrt
C++/WinRT是一个完全标准的现代C++17语言投影,用于Windows Runtime(WinRT)API,实现为基于头文件的库,并旨在为您提供对现代Windows API的一流访问。使用C++/WinRT,您可以使用任何符合标准的C++17编译器编写和使用Windows Runtime API。...
C++/WinRT是微软推荐的C++/CX语言投影的替代品。
基本上它是标准的C++,但UI是用XAML定义的。
尽管如其他答案所述,似乎使用C#才是微软最喜欢的方法。C++/WinRT看起来几乎就像C#一样。