《精通.NET互操作:P/Invoke、C++ Interop和COM Interop》

26 篇文章 1 订阅
一篇用C++/CLI讲述在托管委托(delegate)和非托管函数指针之间相互转化的文章
我们的图书《精通.NET互操作》出版有一个月的时间了,有一些朋友会想我请教一些问题。并反馈说,没有专门详细地介绍有关用委托实现函数指针、回调函数的章节。我觉得大家的建议很有道理。现在这里做个记号,挖个坑。 之所以推荐这篇文章是有两个原因: 1. 它介绍了在托管委托和非托管函数指针,回调函数之间相互转换的方法 2. 它使用C++/CLI实现了对整个问题的描述。因为网络上有关C++ Interop的相关资料很少。所以值得一看 Marshalling native function pointers 我读后,发现作者主要强调了以下几点: 1.在定义托管委托(delegate)的时候,可以使用UnmanagedFunctionPointer属性(Attribute)指定CallingConvention,以使其托管签名与非托管函数定义相匹配。 2.使用System.Runtime.InteropServices.Marshal类的方法实现托管委托和非托管函数指针之间的封送。 * Marshal.GetFunctionPointerForDelegate方法,用于将托管委托转化为非托管代码可以调用的方法。 * Marshal.GetDelegateForFunctionPointer方法,用于将非托管函数转化为托管委托。 3.垃圾回收器(GC)对封送委托到非托管代码时的影响。由于委托(delegate)和由委托转化成的函数指针处于不同的堆上。所以一定要保证非托管代码执行过程中,托管对象没有被回收。 希望大家觉得有用。
《精通.NET互操作:P/Invoke、C++ Interop和COM Interop》——简介,目标,读者人群

自从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个章节逐一对各项互操作技术进行详细介绍。

 

  • 平台调用

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

 

  • C++ Interop

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

 

  • COM Interop

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

 

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

本书目标

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

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

《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》目录

第一部分 P/Invoke
第1章 使用C/C++类型的非托管函数

        1.1 平台调用简介
        1.2 Hello World!示例程序
        1.3 获得要调用的非托管函数声明
        1.4 平台调用基础知识
        1.5 指定调用约定
        1.6 指定入口点
        1.7 指定字符集
        1.8 处理平台调用中的异常或错误
                1.8.1 处理由非托管函数的错误托管定义所引起的异常或错误
                1.8.2 处理由非托管函数所引起的异常或错误
        1.9 释放非托管内存
                1.9.1 释放由malloc方法分配的非托管内存
                1.9.2 释放由new运算符分配的非托管内存
        1.10 动态平台调用
                1.10.1 平台调用的原理和过程
                1.10.2 通过手动加载非托管DLL实现动态平台调用
                1.10.3 利用反射实现动态平台调用
                1.10.4 利用GetDelegateForFunctionPointer实现动态平台调用
        1.11 提升平台调用性能的技巧
                1.11.1 显式地指定要调用的非托管函数的名称
                1.11.2 对数据封送处理进行优化
                1.11.3 尽量避免字符串编码转换
   
第2章 平台调用中的数据封送
        2.1 字符串的封送
                2.1.1 封送作为参数的字符串
                2.1.2 封送作为返回值的字符串
                2.1.3 封送BSTR类型的字符串
        2.2 封送作为参数的结构体
        2.3 封送从函数体内部返回的结构体
                2.3.1 封送作为函数返回值返回的结构体
                2.3.2 作为函数参数返回结构体
        2.4 封送结构体中的字符串
                2.4.1 结构体中的字符指针字段
                2.4.2 结构体中的字符数组字段
        2.5 控制结构体字段的封送行为
        2.6 控制结构体的内存布局
                2.6.1 定义结构体的部分字段
                2.6.2 联合体的封送
        2.7 封送嵌套的结构体
                2.7.1 指向结构体指针字段的嵌套形式
                2.7.2 结构体实例字段的嵌套形式
        2.8 封送类
                2.8.1 封送引用类型的简单示例
                2.8.2 封送blittable引用类型
                2.8.3 将引用类型封送为指向指针的指针
        2.9 封送数组
                2.9.1 封送简单类型数组
                2.9.2 封送字符串数组
        2.10 实战演练
                2.10.1 背景介绍
                2.10.2 模块介绍
                2.10.3 实现平台调用
   
第3章 使用平台调用技术调用Win32 API
        3.1 确定要调用的函数
        3.2 处理Win32函数返回的错误码
        3.3 处理回调函数
        3.4 使用Windows定义的常量
        3.5 封送Win32数据类型
                3.5.1 可直接复制到本机结构中的数据类型
                3.5.2 非直接复制到本机结构中的数据类型
        3.6 处理句柄
        3.7 传递托管对象
        3.8 使用P/Invoke调用Win32 API的最佳实践
                3.8.1 编码规范
                3.8.2 性能
                3.8.3 安全性
                3.8.4 尽量使用Win32函数对应的.NET托管实现
   
第二部分 C++ Interop
第4章 C++ Interop
        4.1 从托管C++代码中调用非托管函数
                4.1.1 使用平台调用技术调用非托管函数
                4.1.2 使用C++ Interop调用非托管函数
        4.2 托管代码使用非托管C++类
        4.3 在非托管代码中使用托管对象
        4.4混合编译托管和非托管代码
                4.4.1 同一项目中的代码混合
                4.4.2 同一源文件中的代码混合
        4.5 C++ Interop中的封送处理
                4.5.1 封送字符串
                4.5.2 封送数组
                4.5.3 封送结构体
                4.5.4 封送回调函数和委托
        4.6 C++ Interop的错误处理
                4.6.1 通过托管C++封送非托管代码抛出的异常
                4.6.2 在编译时检查类型特性
   
第三部分 COM Interop
第5章 在.NET中使用COM组件
        5.1 早期绑定COM对象
                5.1.1 为COM类型库生成互操作程序集
                5.1.2 通过互操作程序集早期绑定COM对象
                5.1.3 创建自定义互操作程序集
        5.2 后期绑定COM对象
        5.3 通过与非托管代码互操作创建COM对象
                5.3.1 通过P/Invoke创建COM对象
                5.3.2 使用C++ Interop包装COM对象
        5.4 封送处理
                5.4.1 封送常用数据类型
                5.4.2 封送VARIANT数据类型
                5.4.3 封送数组
                5.4.4 封送COM集合
                5.4.5 封送自定义数据结构
                5.4.6 处理COM事件
        5.5 错误处理
                5.5.1 映射COM方法返回值HRESULT到托管代码
                5.5.2 使用IErrorInfo接口提供扩展的错误信息
        5.6 提升性能
                5.6.1 细粒度接口和粗粒度接口
                5.6.2 优化封送处理性能
                5.6.3 避免使用后期绑定
                5.6.4 使用ReleaseComObject释放COM对象
                5.6.5 避免跨单元调用
        5.7 共享互操作程序集
   
第6章 在COM中使用.NET程序集
        6.1 使用ClassInterface暴露.NET类
                6.1.1 使用AutoDual实现早期绑定
                6.1.2 使用AutoDispatch实现后期绑定
        6.2 使用接口暴露.NET类
        6.3 使用属性调整类型库元数据
                6.3.1 控制COM标识
                6.3.2 控制COM可见性
        6.4 封送处理
                6.4.1 封送常用数据类型
                6.4.2 封送字符串
                6.4.3 封送数组
                6.4.4 封送自定义数据结构
                6.4.5 封送集合
                6.4.6 封送VARIANT数据类型
                6.4.7 传递可选参数
                6.4.8 暴露托管事件
        6.5 .NET异常处理
                6.5.1 将异常转化为HRESULT
                6.5.2 提供表示成功的HRESULT返回值
        6.6 为COM Interop准备程序集

 

对本书的赞誉
        托管代码与非托管代码之间的交互是许多程序员在.NET开发平台上不得不面对的任务。《精通.NET互操作性:PInvoke, C++ Interop和COM Interop》这本书深入而透彻地解析了.NET支持的三种与原生代码互操作的技术,作者以自己的经验讲述了原生代码与托管代码之间互操作所涉及到的编程要点,以及背后的一些实现原理。书中提供的实例有助于程序员快速领会并掌握.NET与原生代码互操作技术的用法。我建议在.NET平台上工作的程序员读一读这本书。
 
——潘爱民(著名技术作家,著写了《COM原理与应用》等多部畅销书,并翻译了多部经典名作,如《深入解析Windows操作系统》(第四版)、《C++ Primer中文版》(第三版)、《COM本质论》、《计算机网络》(第四版)等。他现在微软亚洲研究院从事系统与安全方向的研究工作)

 
        与非托管代码进行互操作是.NET编程领域里面一个比较难的问题,因为它要求程序员对托管和非托管两个世界都有精深的了解。然而,互操作技术也是.NET框架最根本的基石之一,包括文件操作,网络通讯,GUI界面等大量的.NET类库都由平台调用而实现。事实上,掌握了与非托管代码互操作的技术之后,.NET程序员能够编写的程序类型可以在一夜之间倍增很多,而不只是仅限于 ASP.NET或WinForm程序的编写了。在我做.NET培训的时候,很多听众或者学员都对P/Invoke和COM Interop技术表现出了很大的兴趣,却又苦于没有C/C++的开发背景,在编写与非托管代码进行互操作的代码时可谓举步维艰。其实当年我在自己摸索其中的规律时,也耗费了大量的时间和精力。在各种.NET技术社区,关于非托管代码互操作的问题不绝于耳。该书的及时出现为以后的学习者铺平了道路。这本书上的很多内容不是MSDN或者网上可以找到的,互操作代码的编写永远都是个复杂的任务。程序员只有掌握了其中的规律,了解了托管和非托管两个世界中程序的运行原理,才可能编写出高质量的互操作代码。本书能够极大地帮助程序员掌握这门技术。
 
——夏桅(2005年微软最有价值专家(MVP),CSDN技术论坛.NET版大版主(网名Sunmast(速马))。《.NET企业服务框架——应用.NET企业服务开发分布式业务解决方案》的译者之一)

 
        .NET平台是个托管的世界,提供了与以往完全不同的编程模型。毋庸置疑,.NET是当前及未来Windows平台下开发技术的主流。但转到.NET平台并非意味着使用.NET将现有的C/C++/COM代码进行重写。.NET提供的丰富互操作技术使开发人员能够通过这些技术将.NET代码与非托管代码进行集成,以重用现有非托管代码。可惜的是,市场上大部分.NET书籍对互操作技术少有涉足,中文资源尤其缺乏。本书深入且详尽地介绍了如何在托管代码与非托管代码之间进行互操作,涉及到了互操作技术的各个方面,是本非常有价值的参考书,高度推荐!
 
——金雪根(2002~2005年微软最有价值专家(MVP),CSDN技术论坛.NET版大版主(网名Saucer(思归))。《.NET企业服务框架——应用.NET企业服务开发分布式业务解决方案》的译者之一)

 
        从2000年.NET平台问世以来,.NET Framework已经从当初的1.0发展到目前的4.0。.NET为软件开发过程提供了一种新颖、高效的编程模型,因此广受软件企业及程序员们的青睐。但很多时候,程序员还需要在.NET中重用已有的、经过严格测试的非托管代码。虽然.NET平台提供了重用非托管代码的互操作技术,但是由于托管与非托管编程模型之间存在的巨大差异,因此掌握这些互操作技术并非易事。我曾经就为托管代码与非托管代码的交互操作问题而挠首不已,如果那时就有这么一本具有针对性的专业书籍,我就能省去很多的摸索时间和寻觅解决方案的痛苦过程。本书对.NET平台提供的各种互操作技术的方法和原理进行了深入且全面的介绍,并通过实际问题介绍了各种情况下的最佳实践。据我所知,本书是国内第一本专门介绍.NET互操作性的书。对于.NET开发人员来说,本书无疑是一本难得的好书,非常值得一读。
 
——陈缘(2005-2008年微软最有价值专家(MVP),CSDN技术论坛VB版版主(网名supergreenbean(超级绿豆)),《.NET 2.0应用程序调试》译者)

 
        在微软的技术格局中,风头正劲的现代软件开发平台.NET所代表的托管代码世界,与已经早已取得实质性市场认同的非托管软件开发世界(比如C++、COM等)相比,编程模型完全不同。以微软尽量保持向下兼容的一贯设计风格,.NET的设计中自然引入了各种互操作技术,以使这两个世界的往复沟通成为可能。然而多年的实践告诉我,这一领域就像是朵月中花——看上去很美,可真要“得道”却并非易事。.NET提供的互操作技术远比想象中要复杂和晦涩的多,这本国内外少有的专门全方面讲解.NET互操作技术的著作的出现实属难能可贵、雪中送炭。本书的两位作者把在该领域内多年摸索与实践的宝贵经验系统化地汇集在本书中,相信一定能够帮助读者深入理解和掌握.NET互操作技术。
 
——金戈(2004-2008年微软最有价值专家(MVP),《代码大全(第2版)》首席译者)

 
        微软发布了.NET Framework框架,这并不意味着要抛弃一切旧的技术,那些长期积累下来的非托管代码编写的东西,经过实践的检验,曾经带来过巨大的价值。将这些原有的代码转换成托管代码是不现实的,如何在托管代码与非托管代码之间进行互操作,继续使用原有的代码,本书给出了详细的解答。本书阐述了托管代码与非托管代码进行交互操作的主要技术,既有理论,又有详细的例子。相信读者通过阅读本书,能够全面掌握.NET互操作性这一技术的。
 
—— 孟宪会(2002-2008年微软最有价值专家(MVP),微软中文技术论坛版主,CSDN技术论坛.NET及Web开发版大版主(网名 net_lover(孟子E章)),《ASP.NET 2.0应用开发技术》作者,《Eric Meyer谈CSS(卷1)(卷2)》译者)

 
        .NET提供了与非托管代码进行交互操作的支持。但是由于互操作代码经常很复杂,即使资深的开发人员也经常需要互操作方面的帮助。本书对托管代码与非托管代码进行互操作的技术做了详尽的介绍。书中每个部分都有配套的示例,指导读者处理各种互操作问题。本书对于需要经常进行互操作的开发人员来说是一本很好的参考书。
 
——蒋晟(2004-2008年微软最有价值专家(MVP),CSDN技术论坛VC/MFC版主,微软MSDN中文论坛Visual C++版主)
本书所用术语表

特注:这些信息来源于随《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》书附赠的光盘

 

A

assembly,程序集

apartment model,单元模型

 

B

blittable type,可直接复制到本机结构中的类型

back propagate,回传

buffer,缓冲区

Best Practice,最佳实践

binding,绑定

 

C

Common Language Runtime(CLR),公共语言运行库

cooperative,协作式

caller,调用方

callee,被调用方

calling convention,调用约定

Constrained Execution Region(CER),受限执行区域

Critical Finalizer,关键终结器

Custom Runtime Callable Wrapper(CRCW),自定义运行库可调用包装

cross apartment,跨单元

COM client,COM客户端

COM Callable Wrapper(CCW),COM可调用包装

connetion point,连接点

 

D

DLL,动态链接库

delegate,委托

dual interface,双接口

 

E

exception,异常

Extended Stack Pointer,栈指针寄存器

Common Language Specification(CLS),公共语言规范

early binding,早期绑定

 

F

flattened,单一化

formatted class,格式化类

finalizable,可终结

finalizer,终结器

 

G

Garbage Collector(GC),垃圾收集器,垃圾回收器

Garbage Collection,垃圾回收

Global Assembly Cache(GAC),全局程序集缓存

 

H

handle,句柄

 

I

interop,互操作

immutable,不可变

initialize,初始化

inline array,内联数组

interop assembly,互操作程序集

Interface Definition language(IDL),接口定义语言

Intermediate Language(IL),中间语言

intellisense,智能感知

 

L

lib,静态链接库

late binding,后期绑定

level of indirection,参数引用级别

lower bound,下限

 

M

marshal,封送

managed code,托管代码

marshaler,封送拆收器

managed wrapper,托管包装

module,模块

magic number,奇幻数字

Microsoft Interface Definition Language(MIDL),接口定义语言

Multi Threaded Apartment(MTA),多线程单元

 

N

native code,本机代码

name decoration,名称重整

name resolution,名称解析

non-blittable type,非直接复制到本机结构中的类型

Component Object Model(COM),组件对象模型

Thread Neutral Apartment,线程中立单元

 

O

Object Definition Language(ODL),对象定义语言

outgoing interface,外发接口,传出接口

 

P

Platform Invocation Services(P/Invoke或PInvoke),平台调用

preemptive,抢占式

pin,锁定

primitive type,基元类型

proxy,代理

Primary Interop Assembly(PIA),主互操作程序集

 

R

Reflection,反射

reference type,引用类型

Runtime Callable Wrapper(RCW),运行库可调用包装

 

S

stack frame,堆栈帧

signature,签名

singleton,单例

STL,标准模板库

Single-Threaded Apartment(STA),单线程单元

strong name,强名称

smart pointer,智能指针

safe array,安全数组

sink,事件接收器

 

T

Thread Local Storage,线程本地存储

thread context,线程上下文

thread apartment,线程单元

type coercion,类型强制

threading model,线程模型

 

U

unmanaged code,非托管代码

untyped parameter,非类型化参数

unmanaged heap,非托管堆

union,联合体

unsafe,非安全

upper bound,上限

 

V

value type,值类型

 

有关.NET互操作技术的互联网资源

特注:这些信息来源于随《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》书附赠的光盘

 

    虽然本书对P/Invoke、C++ Interop及COM Interop这3种互操作技术进行了全面且详细的介绍,但是如果读者能从丰富的互联网资源中获取一些有用的信息,无疑能加深读者对本书所介绍的互操作知识和方法的理解。下面列出了一些互联网上有关互操作技术的有用资源。

2.1 Interop

(1)interop123网站

l  URL

http://www.interop123.com

http://www.interop123.net

http://www.interop123.cn

l  描述

本书的技术支持网站,也提供了一个互操作最佳实践的交流平台。

 

(2)dotnetinterop网站

l  URL

http://www.dotnetinterop.com/

l  描述

一个列出了不少有关互操作技术资源的网站

 

(3)An Overview of Managed/Unmanaged Code Interoperability

l  URL

http://msdn.microsoft.com/en-us/library/ms973872.aspx

l  描述

该文章介绍了托管代码和非托管代码之间交互操作的一些基础知识。

 

(4)Interoperating with Unmanaged Code

l  URL

http://msdn.microsoft.com/en-us/library/sd10k43k.aspx

l  描述

包括了一系列主题文章,介绍了一些在托管代码和非托管代码之间进行互操作的知识。

 

2.2 P/Invoke

(1)pinvoke.net网站

l  URL

http://www.pinvoke.net/

l  描述

此网站上有大量丰富的对Win32 API进行P/Invoke时所需进行的托管声明,使开发人员可以学习或快速查找某些Win32函数的对应.NET声明。

 

(2)Platform Invoke Tutorial

l  URL

http://msdn.microsoft.com/en-us/library/aa288468.aspx

l  描述

本文介绍了如何借助于P/Invoke技术在C#中调用非托管DLL中的函数及如何封送一些常用数据类型。

 

(3)Microsoft Win32 to Microsoft .NET Framework API Map

l  URL

http://msdn2.microsoft.com/en-us/library/aa302340.aspx

l  描述

该文档列出了在.NET Framework中已经实现了的、与Win32 API函数具有相同功能的方法。在避免不必要的、对某些Win32函数的进行P/Invoke的同时,也能使用.NET提供的对应托管实现编写更安全、更高效的代码。

 

(4)Windows API Reference

l  URL

http://msdn2.microsoft.com/en-us/library/aa383749(VS.85).aspx

l  描述

有关Windows API的最权威指南。

 

(5)CLR Inside Out: Marshaling between Managed and Unmanaged Code

l  URL

http://msdn2.microsoft.com/en-us/magazine/cc164193.aspx

l  描述

解释了P/Invoke中容易混淆的某些基本概念,以及能够简化在托管和非托管代码间封送数据的方法和技巧。也包含了一个能够为Win32函数自动生成对应托管声明等功能的小工具。

 

(6)Calling Win32 DLLs in C# with P/Invoke

l  URL

http://msdn.microsoft.com/zh-cn/magazine/cc164123(en-us).aspx

l  描述

介绍了如何使用P/Invoke技术调用Win32 API函数。

 

(7).NET Interoperability: .NET ? Win32

l  URL

http://www.blong.com/Conferences/BorConUK2002/Interop1/Win32AndDotNetInterop.htm

l  描述

本文重点介绍了如何在托管代码中调用非托管DLL导出的函数。

 

(8)从托管代码调用本机函数

l  URL

http://msdn.microsoft.com/zh-cn/library/ms235282.aspx

l  描述

介绍了如何在C++中使用显式P/Invoke(DllImport属性)及使用C++ Interop(隐式PInvoke)从托管代码调用本机函数。

 

2.3 C++ Interop

(1)使用 C++ Interop

l  URL

http://msdn.microsoft.com/zh-cn/library/2x8kf7zx(VS.80).aspx

l  描述

该主题介绍了如何使用C++ Interop技术实现托管代码和非托管代码的交互操作。

 

(2)Interop 的性能注意事项 (C++)

l  URL

http://msdn.microsoft.com/zh-cn/library/ky8kkddw.aspx

l  描述

该主题介绍了使用C++ Interop技术在托管代码与非托管代码之间进行互操作时有关性能的若干准则和建议。

 

2.4 COM Interop

(1)CLR 完全介绍: COM Interop 简介

l  URL

http://msdn.microsoft.com/zh-cn/magazine/cc163494.aspx

l  描述

该主题介绍了COM Interop有关的基本概念,并提供了示例,适合对COM Interop技术进行快速入门。

 

(2)Understanding Classic COM Interoperability With .NET Applications

l  URL

http://www.codeproject.com/KB/COM/cominterop.aspx

l  描述

该主题详细介绍了如何借助于COM Interop技术在托管代码中使用COM组件以及如何在COM客户端中使用.NET程序集。

 

(3)COM Interop Tutorials

l  URL

http://msdn.microsoft.com/en-us/library/aa645712(VS.71).aspx

l  描述

该主题包含了两篇在托管代码和COM组件之间进行交互的简要指南。

 

(4) .NET Interoperability: COM Interop

l  URL

http://www.blong.com/Conferences/BorConUK2002/Interop2/COMNetInterop.htm

l  描述

该文章介绍了如何在托管代码中使用非托管COM对象,以及如何在COM客户端中使用托管.NET对象

 

(5)Improving Interop Performance

l  URL

http://msdn.microsoft.com/en-us/library/ms998551.aspx

l  描述

该文章介绍了设计和创建用于同COM组件进行互操作的.NET组件时,有关提升性能的若干建议。

 

2.5 封送处理

(1)Interop Marshaling

l  URL

http://msdn.microsoft.com/en-us/library/04fy9ya1.aspx

l  描述

该主题介绍了使用P/Invoke和COM Interop时,如何对数据进行封送处理。

 

(2)Default Marshaling Behavior

l  URL

http://msdn.microsoft.com/en-us/library/zah6xy75.aspx

l  描述

该主题介绍了如何识别互操作封送处理服务的默认封送处理行为。并对数组、布尔、字符、字符串、类、结构体、对象及委托的封送处理行为进行了详细的介绍。

 

(3)Copying and Pinning

l  URL

http://msdn.microsoft.com/en-us/library/23acw07k(VS.71).aspx

l  描述

该主题介绍了在封送数据时,封送拆收器如何拷贝和锁定数据。

 

(4)Overview of Marshaling in C++

l  URL

http://msdn.microsoft.com/zh-cn/library/bb384865.aspx

l  描述

该主题介绍了在混合模式下,如何在本机类型和托管类型之间封送数据。

 

(5)Blittable and Non-Blittable Types

l  URL

http://msdn.microsoft.com/zh-cn/library/aa719638(en-us).aspx

l  描述

该主题介绍了可直接复制到本机结构中的类型及非直接复制到本机结构中的类型。

 

(6)Windows Data Types

l  URL

http://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx

l  描述

该主题介绍了Windows编程中的常用数据类型。

 

有关.NET互操作技术的源代码和示例资源

有关.NET互操作技术的源代码和示例资源

特注:这些信息来源于随《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》书附赠的光盘

(1)Platform Invoke Samples

l  光盘位置

Resources\Platform Invoke Samples

l  资源描述

该范例代码演示了如何使用P/Invoke调用非托管DLL中的自定义普通函数,以及如何通过P/Invoke调用Win32 API。大部分范例都采用了C#和VB.NET两种语言编写。

 

(2).NET Compact Framework Sample: P/Invoke Library

l  光盘位置

Resources\DotNET Compact Framework PInvoke Samples

l  资源描述

该范例代码演示了如何使用P/Invoke实现.NET Compact Framework中尚未提供的某些功能。

 

(3)Managed Windows API

l  光盘位置

Resources\Managed WinAPI

l  资源描述

这是一个开源项目的源代码。源代码中含有大量对Win32 API函数的P/Invoke调用进行包装的.NET程序集。

 

(4)A Win32 Library for .NET

l  光盘位置

Resources\A Win32 Library for .NET

l  资源描述

这是codeproject上面提供的一个包含了Win32 API函数,常量以及结构体定义的托管类库。

 

(5)PInvoke Library

l  光盘位置

Resources\PInvoke Library

l  资源描述

这是codeplex上面的一个开源项目,提供了包含了Win32和WinCE32 API函数,常量以及结构体定义的托管类库,还包括了调用示例代码。

 

(6)Windows Message ID constants

l  光盘位置

Resources\Windows Message ID constants

l  资源描述

这个资源提供了包含大量Windows消息ID常量定义的C#枚举,是codeproject上面的一个项目。

 

有关.NET互操作技术的工具软件

有关.NET互操作技术的软件

特注:这些信息来源于随《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》书附赠的光盘

(1)P/Invoke Interop Assistant

l  光盘位置

Tools\PInvoke Interop Assistant

l  工具描述

该开源工具能够给开发者使用P/Invoke带来极大的方便。使用该工具,就可以直接为某个指定API生成对应的C#或VB.NET的声明代码,以供开发者直接使用。这样就可以把开发人员从编写非托管函数原型的繁杂工作中解放出来,这无疑提高了工作效率,而且还减少了出错的可能。更为强大的是,该工具还能够直接从C编写的函数声明(目前还不支持C++)生成对应的C#/VB.NET代码。除此之外,这个工具还可以查看已有的Assembly中的P/Invoke或者COM Interop的函数声明,提示对应的非托管函数的原型以及关于数据封送相关的一些提示和建议。

 

(2)Tlbimp

l  光盘位置

Tools\Type Library Importer in Managed Code

l  工具描述

类型库导入程序(Tlbimp.exe)是一款.NET SDK工具,用于将COM类型库中的类型定义转换为公共语言运行库程序集中的等效定义,以生成互操作程序集。这款TlbImp工具是微软采用托管代码编写的,而且是完全开源的。开发人员可以通过源代码获悉TlbImp的内部工作原理,并且还能根据自己的需求修改和扩展该工具。

 

(3)Tlbexp

l  光盘位置

Tools\Type Library Importer in Managed Code

l  工具描述

类型库导出程序(Tlbexp.exe)是一款.NET SDK工具,用于生成一个类型库,该类型库描述公共语言运行库程序集中定义的类型。

 

(4).NET Reflector

l  光盘位置

Tools\.NET Reflector

l  工具描述

.NET Reflector是一款强大的.NET程序集反编译工具。使用该工具,我们就能够轻松地查看.NET程序集(DLL,EXE等)的源代码。

 

(5)MSIL汇编程序

l  光盘位置

Tools\MSIL汇编程序

l  工具描述

MSIL汇编程序(Ilasm.exe)是一款.NET SDK工具,用于从Microsoft中间语言(MSIL)生成可移植可执行的(PE)文件。

 

(6)MSIL反汇编程序

l  光盘位置

Tools\MSIL反汇编程序

l  工具描述

MSIL反汇编程序(Ildasm.exe)是一款.NET SDK工具,是MSIL汇编程序(Ilasm.exe)的伙伴工具。Ildasm.exe采用包含Microsoft中间语言(MSIL)代码的可移植可执行(PE)文件,并创建相应的文本文件作为Ilasm.exe的输入。

 

(7)全局程序集缓存工具

l  光盘位置

Tools\全局程序集缓存工具

l  工具描述

全局程序集缓存工具(Gacutil.exe)使开发人员可以查看和操作全局程序集缓存和下载缓存的内容。

 

(8)Uuidgen

l  光盘位置

Tools\Uuidgen

l  工具描述

Uuidgen.exe是一款.NET SDK工具,用于生成全局唯一标识符。

 

(9)二进制文件转储器

l  光盘位置

Tools\Dumpbin

l  工具描述

二进制文件转储器(Dumpbin.exe)工具可以用来查看所有32-bit Common Object File Format(COFF)格式的二进文件的信息,如COFF对象,可执行文件,以及DLL等。Dumpbin.exe是常用的P/Invoke辅助工具,主要使用它来获得从非托管DLL中导出的函数信息。

 

(10)程序集注册工具

l  光盘位置

Tools\Regasm

l  工具描述

使用程序集注册工具(Regasm.exe),可以完成注册.NET程序集以及为.NET程序集生成COM类型库的工作。

 

(11)OLE/COM 对象查看器

l  光盘位置

Tools\Oleview

l  工具描述

使用OLE/COM 对象查看器(Oleview.exe)能够以结构化方式查看及配置安装在系统中的COM类。

 

(12)注册表编辑器

l  光盘位置

Tools\Regedit

l  工具描述

使用注册表编辑器(Regedit.exe 或 Regedt32.exe)可以查看和修改注册表信息。

 

(13)PInvoke.net Visual Studio插件

l  光盘位置

Tools\PInvoke.net Add-in

l  工具描述

此Visual Studio插件以pinvoke.net上提供的知识资源为基础,可以让我们在Visual Studio中快捷方便地加入对Win32函数的P/Invoke声明。

 

(14)SWIG

l  光盘位置

Tools\SWIG

l  工具描述

SWIG是一个能够将C/C++编写的程序同各种高级程序设计语言(比如C#,Java等)、脚本语言(比如Perl,PHP, Python等)等程序设计语言进行连接的软件开发工具。

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
副标题: P/InvokeC++ InteropCOM Interop 作者: 黄际洲 / 崔晓源 出版社: 人民邮电出版社 出版年: 2009-5 页数: 419 定价: 68.00元 装帧: 平装 ISBN: 9787115204349 内容简介 · · · · · ·   《精通.NET互操作P/Invoke,C++InteropCOM Interop》介绍Windows平台上的托管代码与非托管代码之间进行互操作的各种技术,包括由.NET提供的各种互操作方法、属性以及各种工具的用法及其工作原理。《精通.NET互操作P/Invoke,C++InteropCOM Interop》包括3部分,平台调用——主要用于解决在托管代码中调用非托管程序设计语言编写的flat API(如Win32 API、C/C++风格的API等)的问题;C++ Interop——技术专门用于解决托管代码与C++编写的非托管代码之间的互操作问题;COM Interop——介绍了使用COM Interop解决在托管代码中调用COM组件,以及在COM中调用托管类型的问题。《精通.NET互操作P/Invoke,C++InteropCOM Interop... (展开全部)   《精通.NET互操作P/Invoke,C++InteropCOM Interop》介绍Windows平台上的托管代码与非托管代码之间进行互操作的各种技术,包括由.NET提供的各种互操作方法、属性以及各种工具的用法及其工作原理。《精通.NET互操作P/Invoke,C++InteropCOM Interop》包括3部分,平台调用——主要用于解决在托管代码中调用非托管程序设计语言编写的flat API(如Win32 API、C/C++风格的API等)的问题;C++ Interop——技术专门用于解决托管代码与C++编写的非托管代码之间的互操作问题;COM Interop——介绍了使用COM Interop解决在托管代码中调用COM组件,以及在COM中调用托管类型的问题。《精通.NET互操作P/Invoke,C++InteropCOM Interop》适合所有在开发过程中需要涉及到托管代码与非托管代码进行交互操作.NET开发人员阅读使用。不论是开始学习.NET编程的开发人员,还是刚刚接触互操作的资深.NET开发人员,都能从《精通.NET互操作P/Invoke,C++InteropCOM Interop》中获益。  
精通.net互操作:P/Invoke、C InteropCOM Interop》是一本关于.net平台下不同互操作技术的书籍。 书中首先介绍了P/Invoke技术。P/Invoke(Platform Invoke)是一种在.net中调用非托管代码的技术。它通过声明DllImport特性并指定非托管函数的名称、返回类型、参数类型等信息,来让.net应用程序调用非托管DLL中的函数。这种方式可以方便地与已有的C/C++代码进行整合,扩展.net平台的功能。 然后,书中探讨了C Interop技术,即C语言互操作技术。C Interop主要包括两种形式:Managed C++C++/CLI。Managed C++允许在.net应用程序中混合使用C++和C#代码,并通过提供的语言扩展和编译选项实现两者之间的互操作C++/CLI是使用C++/CLI语言编写的.net应用程序,它提供了一种丰富的语法和特性,使得C++与CLR之间的交互更加便捷。 最后,书中介绍了COM Interop技术。COM Interop是一种用于在.net中与COM组件进行互操作的技术。通过使用COM Interop,可以将COM组件包装为.net可调用的对象,使得.net应用程序可以通过接口调用COM组件的功能,并在运行时处理COM对象的生命周期管理。 《精通.net互操作:P/Invoke、C InteropCOM Interop》深入介绍了这三种互操作技术的原理、用法和注意事项,并结合示例代码和实际应用场景进行讲解。这本书对于想要在.net平台下进行跨平台、跨语言的开发人员来说,是一本非常有价值的学习资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值