对Microsoft Visual C++语言进行扩展可以生成.NET代码,这些扩展称为C++.NET托管扩展。C++是惟一一种可以在同一个源文件中混合.NET代码和非托管代码的语言,是真正的.NET系统语言。\r\n 本书内容根据开发过程进行组织。全书分7章,首先描述语言的基本特性,然后探讨.NET的特性,如Interop、委托和GUI应用程序,最后介绍Visual Studio.NET的项目管理和调试功能。\r\n 本书适合准备使用C++.NET托管扩展进行开发的中、高级读者阅读。
前言\r\n\r\n第1章 托管类型\r\n\r\n1.1 Visual C++.NET中的新关键字\r\n1.1.1 MSIL和标准代码\r\n1.1.2 C++基元类型\r\n1.2 托管类型和值类型\r\n1.2.1 托管对象\r\n1.2.2 值类型\r\n1.2.3 托管指针\r\n1.2.4 通过引用传递和通过值传递\r\n1.2.5 属性\r\n1.2.6 委托和事件\r\n1.2.7 属性(attribute)\r\n1.2.8 托管接口\r\n1.2.9 托管字符串\r\n1.2.10 托管数组\r\n1.2.11 异常和托管代码\r\n1.3 实现.NET类型\r\n1.3.1 命名空间\r\n1.3.2 继承\r\n1.3.3 导出和导入类型\r\n1.3.4 强制类型转换和转换\r\n1.3.5 托管操作符\r\n1.3.6 创建和销毁对象\r\n1.3.7 入口点\r\n1.4 本章小结\r\n\r\n第2章 Interop\r\n\r\n2.1 It Just Works!\r\n2.1.1 标准C++类\r\n2.1.2 CRT和静态链接库\r\n2.1.3 C++标准库\r\n2.1.4 非托管类型中的托管指针\r\n2.1.5 全局方法\r\n2.2 平台调用\r\n2.2.1 DllImport\r\n2.2.2 平台调用的背后\r\n2.2.3 平台调用和参数\r\n2.2.4 用IJW调用Win32API\r\n2.2.5 封送拆收处理\r\n2.3 异常\r\n2.4 COMInterop\r\n2.4.1 .NET和COM对象\r\n2.4.2 32具\r\n2.4.3 .NETCOM属性\r\n2.4.4 .NET框架定义的接口\r\n2.4.5 在.NET中使用COM类型\r\n2.4.6 在COM中使用.NET类型\r\n2.4.7 异常\r\n2.4.8 封送.NET对象\r\n2.4.9 线程\r\n2.4.10 COM+Interop\r\n2.5 本章小结\r\n\r\n第3章 委托和事件\r\n\r\n3.1 将委托作为类型安全的函数指针\r\n3.1.1 非托管代码的函数指针\r\n3.1.2 函数指针和全局函数\r\n3.1.3 委托\r\n3.1.4 动态创建委托\r\n3.1.5 委托参数\r\n3.1.6 多点传送委托\r\n3.1.7 将委托作为智能函数指针\r\n3.1.8 异常和委托\r\n3.1.9 委托和Interop\r\n3.1.10 封送委托\r\n3.2 异步编程\r\n3.2.1 参数和异步委托\r\n3.2.2 异步调用委托\r\n3.2.3 异步调用和异常\r\n3.2.4 异步调用和.NET框架类库\r\n3.3 托管事件\r\n3.3.1 .NET框架和事件\r\n3.3.2 统一事件模型\r\n3.3.3 COM事件\r\n3.4 编写多线程代码\r\n3.4.1 托管线程\r\n3.4.2 线程状态\r\n3.4.3 前台线程和后台线程\r\n3.4.4 线程本地数据\r\n3.4.5 线程和异常\r\n3.4.6 同步对象\r\n3.4.7 线程池\r\n3.4.8 被同步的上下文\r\n3.5 本章小结\r\n\r\n第4章 用户界面开发\r\n\r\n4.1 用C++开发Windows窗体\r\n4.1.1 组件和容器\r\n4.1.2 生成GUI应用程序\r\n4.2 使用GDI+\r\n4.2.1 图形类\r\n4.2.2 坐标结构\r\n4.2.3 坐标转换\r\n4.2.4 剪辑区域\r\n4.2.5 颜色\r\n4.2.6 笔\r\n4.2.7 画刷\r\n4.2.8 位图\r\n4.2.9 光标\r\n4.2.10 图标\r\n4.2.11 文本和字体\r\n4.2.12 图形路径\r\n4.2.13 区域\r\n4.3 控件和窗体\r\n4.3.1 WndProc的位置\r\n4.3.2 标准Windows控件\r\n4.3.3 异常\r\n4.3.4 事件、属性和状态\r\n4.3.5 控件和ActiveX接口\r\n4.3.6 控件句柄\r\n4.3.7 拖放\r\n4.3.8 超类处理\r\n4.3.9 标准窗体\r\n4.3.10 事件处理策略\r\n4.3.11 使用Windows头文件\r\n4.4 使用托管资源\r\n4.4.1 程序集和Win32资源\r\n4.4.2 托管资源\r\n4.4.3 已编译的托管资源\r\n4.4.4 本地化\r\n4.5 本章小结\r\n\r\n第5章 系统编程\r\n\r\n5.1 程序集\r\n5.1.1 可移植可执行文件\r\n5.1.2 元数据目录\r\n5.1.3 读取元数据\r\n5.1.4 程序集格式\r\n5.1.5 程序集的配置\r\n5.1.6 版本控制和Fusion\r\n5.2 安全\r\n5.2.1 代码访问安全性\r\n5.2.2 基于角色的安全策略\r\n5.2.3 可检验的代码\r\n5.3 非托管.NET服务API\r\n5.3.1 枚举托管进程\r\n5.3.2 获取垃圾回收器的信息\r\n5.3.3 承载.NET运行库\r\n5.4 本章小结\r\n\r\n第6章 用Visual C++.NET构建代码\r\n\r\n6.1 Visual Studio.NETIDE\r\n6.1.1 命令\r\n6.1.2 项目、解决方案和配置\r\n6.1.3 VisualStudio.NET中的选项\r\n6.1.4 编辑代码\r\n6.1.5 Visual Studio.NET命令行\r\n6.1.6 DTE对象\r\n6.1.7 VisualC++7库\r\n6.2 项目类型\r\n6.2.1 托管应用程序\r\n6.2.2 托管类库\r\n6.2.3 托管对象文件和模块\r\n6.2.4 生成文件项目\r\n6.2.5 托管Web服务\r\n6.2.6 Web服务客户\r\n6.2.7 注释Web页\r\n6.3 编译代码\r\n6.3.1 编译器开关\r\n6.3.2 链接器开关\r\n6.3.3 优化\r\n6.3.4 生成步骤\r\n6.4 常见解决方案示例\r\n6.4.1 多程序集解决方案\r\n6.4.2 多模块解决方案\r\n6.4.3 使用资源的项目\r\n6.4.4 带有附属程序集的解决方案\r\n6.5 本章小结\r\n\r\n第7章 调试\r\n\r\n7.1 编写可调试代码\r\n7.1.1 可调试代码\r\n7.1.2 .NET条件代码\r\n7.1.3 跟踪代码\r\n7.1.4 断言\r\n7.2 符号文件和托管代码\r\n7.3 使用Visual Studio.NET调试器\r\n7.3.1 查找程序集\r\n7.3.2 启动调试器\r\n7.3.3 调试进程\r\n7.3.4 调试混合代码\r\n7.3.5 调试多线程代码\r\n7.3.6 跨应用程序域调试\r\n7.3.7 远程调试\r\n7.4 分析\r\n7.5 本章小结\r\n\r\n附录A .NET框架库\r\n附录B 参考资源
.NET最显著的特性是运行库,Microsoft称它为公共语言运行库(CommonLanguageRuntime,CLR)。运行库的概念在Microsoft技术中并不是刚刚出现的一-VisualBasic应用程序总是带有VisualBasic运行库的包袱。Microsoft对Java领域的入侵带来了MicrosoftJava虚拟机(JVM)。但是与VisualBasic运行库和JVM不同,.NET运行库不局限于特定的语言。Microsoft和第三方公司的几种语言都可以编写在.NET运行库中运行的代码。其中有些语言比较新,如C#,而另一些浯言使用现有语言的语法。MicrosoftVisualC++.NET是一种现有的语言,通过对它进行扩展可以产生.NET代码,这些扩展被称为C++托管扩展。
托管扩展使C++类可以利用.NET垃圾回收和内存保护机制。更重要的是,它们使C++代码可以访问.NET框架类库和用其他支持.NET的语言编写的库,而其他语言可以使用C++编写的托管库。C++开发人员要创建功能全面的应用程序不再需要使用COM、DLL导出函数和模板库等所有技术来访向它们所需要的库,所有必需的库代码都可以通过.NET框架类库中的.NET类获得。
从本质上讲,托管扩展定义了C++语言的一个子集——它看起来像C++,感觉像C++,但是实际上是.NET。您可能会问:“既然.NET让笔者可以选择多种语言,为什么还要用C++编写.NET代码?”C++一直是一种系统语言,它为您提供了创建具有创造性的解决方案所需的能力和灵活性。这种特性也延续到了托管扩展中,在其中不仅有.NET运行库和类库的全部功能,也有非托管语言的全部功能。确实,C++是惟一一种可以在同一个源文件中混合.NET代码和非托管代码的语言。编译器还让您可以无缝地访问所有非托管库:静态链接库、模板库、COM对象和DLL。这种访问的方便性意味着可以重用所有现有的代码,并且当.NET框架类库没有合适的类时,可以使用现有的非托管库。同样,没有其他语言可以有这种能力,所以其他语言不会被视为.NET系统语言。
本书内容
本书将引导您从头到尾经历开发过程。首先描述语言的基本特性,然后探讨.NET的特性,如Interop、委托和GUI应用程序。本书的最后两章分别介绍VisualStudio.NET的项目管理和调试功能。用C++开发.NET代码不一定要用VisualStudio.NET,但是正如您在第6章和第7章可以看到的,如果使用它,开发工作将容易得多。下面是每一章内容的更详细说明。
第1章
第1章讨论了托管扩展的基本特性。首先解释如何开发托管类型以及它们与非托管类型的区别,包括它们的声明和用法。本章介绍了如何使用托管数组、接口和异常。以继承和强制类型转换(cast)来说,用托管扩展编写的C++遵循.NET模型而不是C++模型,所以这一章的最后描述了.NET在这些方面与非托管C++的不同。
第2章
使用C++的理由之一是它允许在.NET项目中使用现有的非托管代码。托管扩展编译器有一种称为It Just Works!(IJW)的技术。这种技术使您可以在托管项目中使用非托管库,并且混合托管和非托管类。这一章会介绍如何使用IJW,并揭示IJW的工作原理。
.NET还有一种名为平台调用(platform invoke)的基于属性的技术,它可以让所有支持.NET的语言访问从DLL导出的代码。本章解释了如何使用平台调用,并描述了如何自定义它所执行的封送处理。平台调用的一个变种是COMInterop,这是这一章的最后一个主题。COMInterop让托管代码可以使用COM对象,就像它们是.NET对象一样;也使非托管代码可以使用.NET对象,就像它们是COM对象一样。本章将讲述COM Interop是如何工作的,以及如何注册COM Interop所需要的类并生成COM Interop所需要的属性。
第3章
在非托管项目中,函数指针很有用,因为通过它们可以在运行时而不是在编译时进行函数绑定。C++虚函数和COM接口是基于函数指针的,函数指针使您可以定义通知系统。.NET有自己的函数指针——委托(delegate)——它是类型安全的,因为它消除了非托管函数指针的一大缺点:即在函数指针类型之间进行强制类型转换。
这一章将展示如何在C++中使用委托、这种方式与非托管函数指针的区别,以及如何对非托管代码使用委托。本章还将解释如何通过委托进行异步调用(使用系统提供的线程),并且介绍如何用.NET编写多线程代码。最后,将讲述.NET如何用委托实现名为.NET事件(event)的正式通知机制。
第4章
.NET框架用一种称为GDI+的图形库扩展了Windows。这是一个非托管库,但是.NET框架带有.NET包装类。在.NET中的窗口技术称为Windows窗体。可以用GDI+在窗体上绘图,可以将窗体作为控件的容器。这一章将解释如何在C++中用Windows窗体创建GUI应用程序,并描述如何用Win32窗口实现这种应用程序。本章还展示如何通过.NET事件处理Windows消息,以及如何绕过这种机制,从而取得对窗口行为的最大控制权。
本章还将讨论如何在托管类中有效地使用托管资源和标准资源,使得应用程序不再需要它们时可以释放这些资源。最后,本章定义了什么是托管资源,并解释了如何向应用程序中添加托管资源,还讨论如何本地化资源。
第5章
这一章描绘.NET代码是如何存储在可执行文件中的。首先解释.NET程序集的格式,并且描述它们是如何实现为Win32可移植可执行(PE)文件的。然后讨论如何用.NET框架提供的COM对象得到有关.NET元数据以及程序集中的代码的信息。.NET运行库是用非托管代码实现的,Microsoft将运行库设计为非托管代码可以通过COM对象访问运行库。这一章将解释如何用这些对象从非托管代码中访问并配置运行库,以及如何指示运行库运行托管代码。
托管应用程序可以通过与该应用程序相关联的XML文件进行配置。当应用程序启动时运行库读取这个配置文件,这样它就可以得到有关应用程序所需要的资源的信息。运行库的一大好处是它只会加载生成应用程序时指定要使用的库。您可以配置这些规则——运行库通过配置文件查找这些库时要用到这些规则。代码也可以访问配置文件中的信息,这一章将展示如何做到这一点以及如何扩展配置文件和API以读取它们。
最后,本章描述代码访问安全,并展示如何在代码中应用这种安全机制。本章还展示用C++托管扩展编写的.NET代码所需要的默认权限。
第6章
Visual Studio.NET本身是一个集成了各种应用程序开发工具的应用程序,是托管和非托管应用程序的混合体。这一章将介绍如何利用这个环境开发项目。本章讨论了编译器的功能以及用来管理项目的工具。本章还介绍了有关VisualStudio.NET项目向导和可开发的C++项目的类型。最后介绍了一个可开发托管项目类型的例子,并描述了如何定制项目向导所提供的代码。
第7章
开发周期的最后一个阶段通常是测试阶段:您需要测试项目以保证它按照预期的方式运行,否则,需要调试代码以确定问题所在。尽管测试阶段通常是在开发周期的最后,但是可以预先编写提供诊断信息的代码,使测试工作量大大减少。这一章描述了.NET框架提供的诊断代码中的问题的工具,并解释如何收集这些诊断信息。
VisualStudio.NET集成了托管和标准代码调试器,所以发现问题后,可以单步执行代码直到找到问题的根源。本章介绍如何使用调试器及其各种工具,以及在调试多线程代码和由多个进程组成的应用程序时需要考虑的特殊问题。最后,本章展示了如何分析代码。VisualStudio.NET没有提供代码分析器,但是.NET框架可通过用户提供的COM对象提供分析信息。本章给出了这种分析对象的一个例子。
附录A
.NET框架类库非常全面,其中的代码能够完成以前用C运行时库(CRT)或者标准C++库可以完成的任何任务。这个附录用一系列的表展示了与最有用的CRT函数和标准库类相对应的.NET代码。附录A是您使用.NET时的起点。
附录B
这个附录列出了进一步学习所需的资源。这个列表并不完全,肯定也不是有关.NET资源的最好列表。不过,这里提供的资源曾经对笔者特别有用,希望您也可以从中受益。
系统要求
前5章只需要C++编译器(版本13)。.NET框架SDK可以从Microsoft公司的网站(msdn.microsoft.com/netframework)免费下载。作为.NET框架SDK一部分提供的C++编译器不能产生优化的代码,它也不能提供像非托管ATL属性提供程序这样的扩展,但是它是功能全面的C++编译器,可以用于进行托管和非托管C++开发。如果想要学习.NET框架,那么可以从C++编译器开始。
最后两章使用了VisualStudio.NET的功能。VisualStudio.NET包括全面优化的C++编译器,它还带有非托管库:完整的CRT库、标准C++库和合并的ATL(ActiveX模板库)以及MFC(Microsoft基础类)库,可以从.NET代码中访问所有这些库(msdn.microsoft.com/vstudio)。VisualStudio.NET还提供了可以创建应用程序初始文件的代码向导、管理项目的工具、功能全面的编辑器和集成的调试器。如果要开发包含10个以上的类的项目,那么就应该使用VisualStudio.NET。