.NET 互操作概述.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
.NET 互操作概述

.NET 互操作概述 互操作性使您能够保留和利用在现有非托管代码中的投入 互操作是托管和非托管代码之间的调用,COM、COM+、C++ 组件、ActiveX 组件和 Win32 API 都是非托管代码 .NET Framework 通过平台调用服务、System.Runtime.InteropServices 命名空间和 CLR 以及通过 COM 互操作性(COM 互操作)支持与非托管代码的互操作性 .NET 互操作方式 平台调用 C++中的It Just Works(IJW) COM互操作 .NET 互操作特点 PInvoke 和 COM 互操作 都使用封送处理在托管和非托管代码之间转换诸如整数、字符串、数组、结构和指针等参数 平台调用概述 平台调用使托管代码能够调用从非托管动态链接库 (DLL) 导出的函数,比如 Win32 API 和自定义 DLL。 利用平台调用这种服务,托管代码可以调用在动态链接库 (DLL)(如 Win32 API 中的 DLL)中实现的非托管函数。此服务将查找并调用导出的函数,然后根据需要跨越互用边界封送其参数(整数、字符串、数组、结构等) 。 出于性能的考虑,应检查 .NET Framework 中是否有可用的等价函数而不是使用平台调用。 平台调用依赖于元数据在运行时查找导出的函数并封送其参数 可以调用Win32 API和其他DLL中的函数来控制操作系统中的一大部分 平台调用通常做法 标识 DLL 中的函数 最低限度上,必须指定函数的名称和包含该函数的 DLL 的名称 创建用于容纳 DLL 函数的类 可以使用现有类,为每一非托管函数创建单独的类,或者创建包含一组相关的非托管函数的一个类 在托管代码中创建原型 [Visual Basic] 使用带 Function 和 Lib 关键字的 Declare 语句。在某些少见的情况下,可以使用带 Shared Function 关键字的 DllImportAttribute。这些情况在本节后面部分进行说明。 [C#] 使用 DllImportAttribute 标识 DLL 和函数。用 static 和 extern 修饰符标记方法。 [C++] 使用 DllImportAttribute 标识 DLL 和函数。用 extern “C” 标记包装方法或函数。 调用 DLL 函数 像处理其他任何托管方法一样调用托管类上的方法。传递结构和实现回调函数属于特殊情况。 平台调用过程 查找包含该函数的 DLL。 将该 DLL 加载到内存中。 查找函数在内存中的地址并将其参数推到堆栈上,以封送所需的数据。 将控制权转移给非托管函数。 平台调用过程 注意: 只在第一次调用函数时,才会查找和加载 DLL 并查找函数在内存中的地址。 平台调用会向托管调用方引发由非托管函数生成的异常 标识 DLL 中的函数 函数的名称和序号(函数入口点) 实现所在的DLL文件的名称(文件在那) 创建用于容纳 DLL 函数的类 要封装平台功能,一种有效的方法是将常用的 DLL 函数包装在托管类中。虽然不必在每种情形下都这样做,但由于定义 DLL 函数可能会相当麻烦并且容易出错,所以提供类包装是一种很方便的方法。 在一个类中,为每个要调用的 DLL 函数定义静态方法。定义中可以包括一些附加信息,如在传递方法参数时使用的字符集或调用约定;如果省略这些信息,将选择默认设置。 包装之后,就可以按照对其他任何静态函数调用方法的相同方式来对该函数调用方法。平台调用将自动处理底层的导出函数 在托管代码中创建原型 指定DLL 指定函数入口点 非托管函数在托管的原型定义 可以调整平台调用的默认值 调整定义 无论是否显式设置属性字段,属性字段都可用于定义托管代码的行为。平台调用将按照在程序集中作为元数据存在的各个字段上设置的默认值来执行操作。通过调整一个或多个字段的值,可更改此默认行为。在许多情况下,可使用 DllImportAttribute 来设置值。 指定入口点 入口点用于标识函数在 DLL 中的位置 在托管对象中,目标函数的原名或序号入口点将标识跨越交互操作边界的函数 函数重命名 避免使用区分大小写的 API 函数名 符合现行的命名标准 提供采用不同数据类型的函数(通过声明同一 DLL 函数的多个版本) 简化对包含 ANSI 和 Unicode 版本的 API 的使用 指定字符集 DllImportAttribute.CharSet 字段控制字符串封送处理并确定平台调用在 DLL 中查找函数名的方式 CharSet 字段值 CharSet.Ansi(默认值) 字符串封送处理 平台调用将字符串从托管格式 (Unicode) 封送

文档评论(0)

sd44055 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档