.NET互操作技术社区 P/Invoke, C++/COM Interop

分享.NET互操作技术 —— P/Invoke, C++ Interop和COM Interop
欢迎光临 .NET互操作技术社区 P/Invoke, C++/COM Interop 登录 | 注册 | 帮助
in 搜索

本书简介,本书目标,本书读者人群

本主题共有 0 篇回复,最新回复发表于 04-24-2009, 16:45,作者 P/Invoke.Book.Master
帖子排序: 上一主题 下一主题
  •  04-24-2009, 16:45 12

    本书简介,本书目标,本书读者人群

    自从2000年微软.NET平台问世以来,全球已经有超过四百万开发人员使用.NET平台进行软件开发。对于.NET来说,这无疑是一个巨大的成功。这不仅仅体现在商业上的成功,其核心价值在于.NET为基于微软Windows平台的软件开发过程提供了一种新颖、高效的编程模型。在该模型下,开发人员能够更容易地将精力集中在其特定的开发情景中,而不用过多地关注消息循环、窗口过程等操作系统底层的处理。目前,基于.NET平台的技术和开发环境正处于飞速发展的时期。在本书即将出版之际,微软已经正式发布了.NET Framework 4.0所支持的新特性以及预览版。

    另一方面,由于历史的原因,在.NET出现之前,开发人员已经编写了大量经过严格测试且可复用的非托管代码。它们以C库函数、C++类库以及COM组件的形式存在于诸多应用程序和框架之中,并承担着非常重要的角色。但由于在托管和非托管对象模型之间,数据类型、方法签名和错误处理机制都存在很大差异,从而使两种编程模型之间的代码互用和移植更加复杂。因此,在很长一段时期内,开发人员必须面对.NET与久经考验的“遗留代码(legacy code)”长期并存的局面。当然,开发人员可以选择.NET平台,使用托管代码重写这些已有的非托管代码。但这个重写的过程势必会枯燥无味,而且项目经理也不会在项目进度中安排大量的时间以进行重写代码的工作。更让开发人员感到尴尬的是,很多时候,即使花了很大代价对非托管代码进行了重写,但还是不能保证重写后的托管代码像那些久经考验的非托管代码一样正常或高效地工作。因此在很多情况下,重用已有非托管代码就成了最经济、可行的解决方案。以下是这些情况中的一些典型案例。

     

    • 开发人员所在的部门一直使用第三方提供的COM组件为产品的核心功能提供支持。而新业务要求使用.NET平台。这就出现了一个问题。一方面公司已经为这些COM组件投入了大量的资金,不会轻易放弃这些组件。另一方面开发部门使用.NET平台进行开发,无法直接使用这些COM组件。因此,有效地在.NET平台中重用这些COM组件就成为产品成功的关键要素。
    • 虽然.NET平台为开发人员提供了强大的框架类库(Framework Class Library,简称FCL),但它并没有包含基于Windows开发过程所涉及到的全部Windows API。因此如果开发人员希望使用那些.NET平台尚未支持的编程接口,则需要找到在.NET中调用Win32 API的方法。
    • 在产品中可能会存在一些核心算法模块,它们对产品的质量有很大的影响。因此测试人员对这类模块的要求有时会十分严苛。开发人员不但要保证模块能够在规定时间内完成计算任务,还要保证它在规定的内存空间内得以实现。在这种情况下,使用C++等非托管语言编写的模块与使用.NET编写的程序集相比,在性能上会有较大的提升空间。

     

    可见在不同的开发情境中,开发人员会主动或被动地在开发过程中引入托管代码与非托管代码共存的情况。幸运地是,公共语言运行库(Common Language Runtime,简称CLR)提供了一系列能够使托管代码与非托管代码进行交互操作的解决方案。其中主要包含3类互操作技术,如图1所示。

     

    • 平台调用技术(P/Invoke):主要用于处理在托管代码中调用C库函数及Win32 API函数等非托管函数的情形。
    • C++ Interop:适用于在托管代码与C++类库、核心算法库之间进行高效、灵活的互操作过程。一方面托管代码可以通过包装类机制使用C++类库,另一方面非托管代码可以通过包装模板机制使用托管对象。
    • COM Interop:该技术用于处理托管代码与COM之间的交互过程。托管代码通过运行库可调用包装(RCW)使用非托管COM组件。反过来,非托管COM客户端可以通过COM可调用包装(CCW)使用托管程序集。

     

     

     

    1 .NET提供的3类主要互操作技术

     

    由于不同的非托管对象,其设计和运行机制等存在很多差异。因此,托管代码与这些非托管对象进行交互操作时,在数据类型处理、错误处理机制、创建和销毁对象的规则以及互操作方法上,都需要根据不同的情况,分别进行不同的处理,从而导致互操作技术复杂多变且不易掌握。本书凝聚了作者多年使用互操作技术的经验,以严禁的态度和独特的内容组织结构与行文思路,系统且全面地介绍了在面对上述3种典型的开发情境时,如何在数据封送、性能优化和代码调试等环节均采用最佳实践。本书不但能够帮助读者快速找到解决问题的方法,还能帮助读者深入理解互操作技术的工作原理,并从更高的角度领悟互操作技术的本质和精髓。

    本书的内容及组织结构

    在托管代码与非托管代码之间进行互操作,主要有3种技术。因此本书将分为3个部分,共6个章节逐一对各项互操作技术进行详细介绍。

     

    • 平台调用

    本书的第一部分包含第123章,重点介绍平台调用(Platform Invocation Services,简称P/InvokePInvoke)技术。平台调用技术主要用于解决在托管代码中调用非托管程序设计语言编写的flat API(如Win32 APIC/C++风格的API等)的问题,其基本原理是在托管代码中重新声明一个与使用非托管语言编写的函数相等价的函数,并设置平台调用必需的一些属性及其字段,从而实现在托管代码中调用非托管函数。

     

    • C++ Interop

    本书的第二部分由第4章构成,主要介绍C++ Interop(在早期的.NET版本中,又被称为IJW,即It Just Works)技术。C++ Interop技术专门用于解决托管代码与C++编写的非托管代码之间的互操作问题。使用C++ Interop,无需在托管代码中进行任何特殊声明或设置平台调用所需的属性,即可在托管代码中直接使用flat APICOM API。开发人员甚至可以将托管代码和非托管代码定义在同一源文件中。因此,与COM Interop相比,C++ Interop的功能显得更加强大,但使用C++ Interop要求开发人员对托管代码和非托管代码都具备深入的理解,才能避免诸如因数据封送错误、内存泄漏问题等引发的程序错误或异常。

     

    • COM Interop

    本书的第三部分包含第56两章。分别介绍了使用COM Interop解决在托管代码中调用COM组件,以及在COM中调用托管类型的问题。与平台调用技术非常相似,CLRCOM Interop提供了完备的支持。本书不但会用代码示例解释位于System.Runtime.InteropServices命名空间下的各种API和属性,还将介绍.NET平台为COM Interop专门提供的实用工具及其用法。

     

    请不要忘记查阅本书的配套光盘,它包含本书所有示例的源代码。每个示例都是为介绍互操作的各种技术细节而精心设计的。此外,光盘还包含了许多实用的工具和资源。具体内容可参考本书的附录部分。

    本书目标

    本书旨在介绍Windows平台上的托管代码与非托管代码之间进行互操作的各种技术,这意味着本书将介绍由.NET提供的各种互操作方法、属性以及各种工具的用法及其工作原理。虽然开发人员可以在微软的技术文档中找到相关的介绍,但其中很大一部分都没有对应的示例代码。因此开发人员很难清晰地理解一些方法和工具的用途及用法。此外,在有些情况下,.NET为某些互操作问题提供了不止一种解决方案。因此,介绍如何选择最优的解决方案以及采用最佳的实践方式也是本书的目标之一。

    本书适合所有在开发过程中需要涉及到托管代码与非托管代码进行交互操作的.NET开发人员。不论是开始学习.NET编程的开发人员,还是刚刚接触互操作的资深.NET开发人员,都能从本书中获益。这是由于本书的构成区别于以往基于知识点的成文思路。本书在内容的设计上着眼于开发人员在开发过程中可能会遇到的各种问题,并以实际问题为背景将各种技术细节的介绍融汇于最佳实践之中。因此读者在阅读本书时,既可以根据自身的实际情况在书中直接找到解决问题的方法及示例代码,还可以根据本书的结构系统且全面地学习互操作技术的各个方面,从更高的角度理解互操作技术的本质和精髓。从而使本书不但有着“传道”的作用,还具有“解惑” 的功能。


    P/Invoke.Book.Master
以 XML 格式显示 RSS 新闻订阅源
Powered by Community Server (Personal Edition), by Telligent Systems