前段时间,帮人改了个项目,里面明明感觉是MFC,但是却调用C#的类函数,用的都是gcnew指针,凭借着对C#的熟悉,一点一点的实验,终于帮人把程序改好了,但是却不知道到底是什么东西,C#和MFC的混合编程?感觉也不像,现在发现原来是CLR,找了两篇文章,标记一下,便于以后学习。

文章和代码需要后续验证。


文章1

ATL用于编写COM程序,CLR是.NET的公共语言运行库,MFC是指MFC类库,MFC程序是用这些类库做出的程序,WIN32常规就是不用 MFC,使用API函数编的程序。 MFC、ATL和CLR是VC2005内置的3大库,涵盖了windows的各种开发方法和开发应用。当然关于C++开发的库不止这3个,不过这3个是微 软推荐。从编程所处层次而言,WIN32为最底层,其次是MFC.然后是CLR. WIN32 winAPI MFC MFC类库 CLR .net库.

  1. WIN32常规就是不用MFC,使用API函数编的程序。

  2. MFC库有很多年的历史了,MFC是基于Windows API 的简单封装。其核心架构基于”Document/View”架构(20年前被认为很潮流的一种概念)和消息流动机制。这个库自从VC6开始到现在都没有多 大改动。MFC封装的范围包括GUI,IO,数据库,网络编程等等方面。但是很多系统开发必须的api都没有封装,这样开发者一般都在MFC的基础上自己 处理与业务相关的任务。事实上很多人用MFC只是利用其GUI部分的封装。这个库GUI处理的效率也并不是很高,有时候与UI处理相关的代码会占到整个项 目的一半甚至更多。总的来说,这是一个垂老的库,微软在10年以来,除了对MFC进行修修补补以外,没有进行大的改进或者更新。如果你问MFC还会活多 久?恩,这是个问题。如果有一天MFC不在了,微软在这个级别上并没有其他产品能够代替它。

  3. CLR库是随着.Net Framework 2 和VS2005一起发布的库,其核心的实现和C#,VB.net 一样。都是基于公共语言运行库。.Net Framework封装了大量系统的api,以类库的形式提供给开发者。C++中的CLR库可以使用其中和本机代码有关的部分,目前C++还不能涉及到 asp.net部分。CLR库中的C++颠覆了很多标准C++的传统,甚至可以说,这里的C++不是C++,只是披着C++的皮干其他的事。这里的C++ 更像是C#或者类似的语言。所以这里不叫C++,而叫做C++/CLI,值得一提的是,有关C++/CLI的部分目前还没有被标准C++接受,最近微软有 关C++/CLI标准化的提案被C++标准化委员会拒绝了。所以C++/CLI目前还是微软的一家之言。

  4. ATL用于编写COM程序。ATL库貌似也年纪很大了,至少在我接触到VC的时候就有它的存在了。这个库可以追溯到COM组件,因为ATL的目的就是帮助 开发者更好的与COM交互。到底什么时候有COM这个东西的 ?我也不知道,我只知道COM是有16位版本的,在Windows升级到32位的时候COM也随着升级到了32位。COM就像一些封装好的类对象一样,通 过封装系统的api,提供一些标准的方法来给你使用。所以系统中有什么组件,就可以在ATL中用什么方法 。所以ATL不止可以写ActiveX,也可以有window,也可以有其它。有时候有些微软发布的功能是只以COM组件的形式发布的,例如MSXML, 这时候MFC就不适合,是要ATL来处理的。但是ATL在处理UI这方面并不是很强,所以微软工程师有一个开源的UI 框架,叫做WTL,专门用来处理UI的。ATL库的缺点是,作为模板库,在出现错误的时候会比较麻烦

文章2

CLR是Common Language Runtime的缩写,它是.NET公共语言运行库。MFC是微软的基本类库,用于使用Visual C++开发环境创建本地应用程序。顾名思义,CLR具有跨平台、跨语言的特性,各种语言都可以使用CLR开发.NET平台上应用程序。 
自然,本地应用程序也可以享受CLR的丰富的功能。使用Visual Studio 2005 可以很方便地创建一个CLR与MFC混合编程的工程,在工程中,我们即可以使用MFC中的类,也可以使用CLR中的类。工程的创建和设置如下: 
1)首先创建一个MFC工程。例如,支持MFC的Win32控制台应用程序。 
2)配置项目,使工程具有公共语言运行库支持。选项可以在菜单 
“项目/属性/配置属性/常规/公共语言运行库支持” 
选择公共语言运行库支持(/clr)。 
3)为了使用CLR类库中的Console类,在程序的开始包含如下两行:

#using <mscorlib.dll>
using namespace System; //下列代码演示了如何使用CLR与MFC混合编程: int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0; // 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败/n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
CString mfcMsg; //MFC中的字符串类
mfcMsg = "第一个MFC与CLR混合编程的例子!"; //C++/CLI中使用gcnew关键字表示在托管堆上分配内存
String^ clrMsg = gcnew String(mfcMsg.GetBuffer()); Console::WriteLine(clrMsg); //Console是CLR中System名字空间的对象
}
}

最新文章

  1. Scalaz(32)- Free :lift - Monad生产线
  2. auto dock
  3. Storm配置项详解【转】
  4. oracle 把一个用户的表结构导入到另一个用户下
  5. StandardServiceRegistryBuilder
  6. 自己定义UITabBarController
  7. MyEclipse 2013 新功能介绍
  8. 【推荐分享】大量JavaScript/jQuery电子书籍教程pdf合集下载
  9. 如何实现虚拟机(VirtualBox)中的Ubuntu与Windows XP间的数据共享
  10. IdentityServer4客户端如何获取自定义声明,了解一下?
  11. HashTable与ConcurrentHashMap的区别
  12. OO第二单元作业分析
  13. byteBuffer的用法
  14. SQL SERVER 2008 R2安装的时候提示“该实例名称MSSQLSERVER已在使用
  15. gitlab-ci的注意点
  16. SSL/TLS Server supports TLSv1.0
  17. Git查看与修改用户名、邮箱(转载)
  18. 关于xib控件变成框框An internal error occurred
  19. JS设计模式——1.富有表现力的JS
  20. VR内容是如何制作的!

热门文章

  1. caffe dropout解读
  2. 为什么每次登录要手动 source /etc/profile ...
  3. 最新 美柚java校招面经 (含整理过的面试题大全)
  4. easyui 解决连弹两个dialog时候,第二个dialog居中问题
  5. amazeUI modal 模态框 关闭属性
  6. controller中获取当前项目物理绝对路径
  7. 如何写出优美的 C 代码 面向对象的 C
  8. 【牛客网】Idol Master
  9. golang之数组与切片
  10. mysql中char和varchar区别