已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于C#的.NETFramework程序设计,第10章数据流和文件第11章Internet访问第12章序列化第13章远程处理和XMLWebService第14章线程和异步编程第15章托管代码与非托管代码之间的互操作第16章使用MicrosoftADO.NET访问数据第17章属性,第1章Microsoft.NETFramework概述第2章托管执行环境的介绍第3章使用组件第4章部署与版本控制第5章通用类型系统第6章类型的使用第7章字符串、数组和集合第8章委托和事件第9章内存和资源管理,第15章托管代码与非托管代码之间的互操作,集成服务平台调用在托管代码中调用COM对象在COM对象中调用.NET对象,集成服务,平台调用介绍介绍COM的互操作性Interop封送处理概述,15.1集成服务,平台调用介绍,允许托管代码调用在DLL中实现的非托管方法为下列功能提供机制定位实现指定函数的DLL,加载DLL到内存中发现和调用非托管函数在托管和非托管代码之间进行参数的封送处理,15.1.1平台调用介绍,介绍COM的互操作性,COM和.NET的不同之处生命期管理COM:引用计数对.NET:垃圾回收服务发现COM:查询接口对.NET:反射对象内存COM:固定的对.NET:可以移动的运行库可调用包装(RCW)使用托管客户端调用COM对象上的方法COM可调用包装(CCW)使用COM客户端调用托管对象上的方法,15.1.2介绍COM的互操作性,Interop封送处理概述,互操作封送处理控制在方法调用时如何在托管和非托管内存间传递数据互操作封送处理是CLR封送处理服务执行的运行时活动Blittable数据类型对托管和非托管内存是一样的,不需要转换数据类型(C#关键字)System.Byte(byte)System.SByte(sbyte)System.Int16(short)System.UInt16(ushort)System.Int32(int)System.UInt32(uint)System.Int64(long)System.IntPtrSystem.UIntPtr,15.1.3Interop封送处理概述,Interop封送处理概述(续),Non-blittable类型是那些在托管和非托管内存具有不同表现的类型,需要进行转换例如,托管字符串就是non-blittable类型标准RCW和CCW通常为跨COM和.NET边界调用提供了合适的封送处理可以使用自定义属性选择性地调整运行库表示托管和非托管代码的形式,15.1.3Interop封送处理概述,集成服务平台调用在托管代码中调用COM对象在COM对象中调用.NET对象,第15章托管代码与非托管代码之间的互操作,平台调用,平台调用工作方式从托管代码中调用Win32API调用非托管函数钉住操作封送处理平台调用的性能问题及局限性,15.2平台调用,平台调用工作方式,平台调用工作过程定位包含被调用方法的DLL把该DLL加载到内存查找函数在内存中的地址并将其参数压入堆栈,以封送所需的数据把控制权移交给非托管函数,15.2.1平台调用工作方式,平台调用工作方式(续),15.2.1平台调用工作方式,从托管代码中调用Win32API,用static和externC#关键字声明方法导入实现非托管函数的DLL,15.2.2从托管代码中调用Win32API,DllImport(,EntryPoint=,CharSet=,从托管代码中调用Win32API(续),用自定义封送处理信息来覆盖.NETFramework提供默认的封送处理,15.2.2从托管代码中调用Win32API,调用非托管函数,有两种方法可调用非托管DLL中的方法使用DLLImport属性导入System.Runtime.InteropServices命名空间声明一个静态方法来调用非托管方法,不用提供方法实现使用DllImport属性标注方法,指定输出非托管方法的DLL的名称,15.2.3调用非托管函数,usingSystem.Runtime.InteropServices;DllImport(msvcrt.dll,CharSet=CharSet.Ansi)publicstaticexternintputs(Stringstr);,钉住操作,数据被临时锁定在当前内存位置,防止被CLR的垃圾回收器重新分配数据在托管和非托管代码之间传递时,执行锁定操作如果对象有固定的布局,在托管和非托管内存中数据表现形式一样,则通过指针进行封送有固定布局,但数据在托管和非托管内存中表现不一致,通过引用来封送如果对象没有固定的布局,通过值或者引用传递,如System.String和System.StringBuffer对象,15.2.4钉住操作,封送处理,大多数数据类型在托管和非托管内存中都有公共的表示形式,而不需要封送拆收器的特殊处理,称为可直接复制到本机结构中的类型非直接复制到本机结构中的类型在托管和非托管语言中具有不同的或不明确的表示形式。当被封送时,这些类型可能需要转换用MarshalAs属性来指定自定义封送处理,15.2.5封送处理,publicstaticexternintMessageBoxW(inth,MarshalAs(UnmanagedType.LPWStr)stringm,);,平台调用的性能问题及局限性,平台调用只支持带整数参数的回调函数平台调用不对所有类型提供支持平台调用只支持调用从DLL导出的全局函数当以引用传递数组类型的参数时,返回的数组大小被调整为1,15.2.6平台调用的性能问题及局限性,实验A调用Win32API函数,练习1在托管代码中调用Win32API函数,集成服务平台调用在托管代码中调用COM对象在COM对象中调用.NET对象,第15章托管代码与非托管代码之间的互操作,在托管代码中调用COM对象,运行库可调用包装生成运行库可调用包装线程模型签名转换和错误处理封送处理性能和安全问题最佳实践,15.3在托管代码中调用COM对象,运行库可调用包装,15.3.1运行库可调用包装,生成运行库可调用包装,用如下3个方法产生运行库可调用包装在VisualStudio.NET工程中添加COM组件的引用使用类型库导入器创建自定义包装,15.3.2生成运行库可调用包装,线程模型,COM组件使用单元来同步对托管资源的访问当调用COM对象时,运行库创建并初始化一个COM单元确保应用程序的主线程是STA模式,15.3.3线程模型,usingSystem.Threading;usingAPTOBJLib;Thread.CurrentThread.ApartmentState=ApartmentState.STA;AptSimpleobj=newAptSimple();obj.Counter=1;,STAThreadstaticvoidMain(),签名转换和错误处理,15.3.4签名转换和错误处理,封送处理,对于将数据封送处理到COM和从COM中封送处理数据的支持是广泛的,并几乎总是提供正确的封送处理行为表格显示了C#类型和相应COM类型的比较用MarshalAsAttribute属性来改变数据封送行为用两种方法自定义RCW来处理类型编辑互操作程序集手动创建包装类,15.3.5封送处理,publicvoidM1(MarshalAs(UnmanagedType.LPWStr)Stringmsg);,性能和安全问题,托管和非托管互操作时的转换会造成每次调用10到40个指令的系统消耗限制代码中出现的转换次数一次进行多个API调用在创建COM对象前,设置ApartmentState来阻止代理和存根的创建对可信任代码,当托管代码调用非托管代码时,使用SuppressUnmanagedCodeSecurity属性防止安全检查,15.3.6性能和安全问题,最佳实践,使用Ildasm.exe来检查已产生程序集的命名空间和类的名称在VisualBasic6.0或者C+的引用参数在VB.NET将产生一个用ref关键字修饰的参数,15.3.7最佳实践,实验B调用COM对象,练习1在托管代码中调用COM对象,集成服务平台调用在托管代码中调用COM对象在COM对象中调用.NET对象,第15章托管代码与非托管代码之间的互操作,从COM对象中调用.NET对象,COM可调用包装导出过程在系统注册表中注册.NETFramework类使用ClassInterfaceAttribute在COM中使用.NETFramework类型托管和非托管事件最佳实践,15.4从COM对象中调用.NET对象,COM可调用包装,15.4.1COM可调用包装,导出过程,程序集中的任何公有类都被转换为类型库中的coclass将显式实现的接口输出到类型库托管代码类型库,15.4.2导出过程,publicinterfaceIShapevoidDraw();voidMove(intx,inty);classCircle:IShapevoidDraw();voidMove(intx,inty);voidEnlarge(intx);,uuid(),dual,odl,oleautomationinterfaceIShape:IDispatchHRESULTDraw();HRESULTMove(intx,inty);uuid()coclassCircleinterfaceIShape;,在系统注册表中注册.NETFramework类,使用Regasm.exe在系统注册表中注册.NETFramework类注册.NETFramework类会在系统注册表中添加如下注册项Hkey_Classes_RootCLSID注册键中.NETFramework类的CLSID两个存根键:HKCRCLSIDclass_ID键下的ImplementedCategories和InprocServer32HKCRCLSID键的默认值为类的ProgIDInprocServer32默认被设置为包含公共语言运行库的DLL的名称,15.4.3在系统注册表中注册.NETFramework类,使用ClassInterfaceAttribute,类接口提供.NETFramework对象显式公开的所有公共方法、属性、字段和事件阻止创建类接口创建一个dispatch接口创建一个双绑定接口,15.4.4使用ClassInterfaceAttribute,在COM中使用.NETFramework类型,在非托管代码中使用.NETFramework类设置对描述.NETFramework类的类型库的引用在VisualBasic6.0中,使用引用对话框来设置引用在VisualC+6.0中,使用#import指令来引用类型库创建和使用类型库中定义的类对象,15.4.5在COM中使用.NETFramework类型,托管和非托管事件,.NET事件模型和COM中的事件模型不同托管事件是基于委托的,但是COM中的非托管事件是基于连接点的关于下列话题的更多内容,请查看.NETFrameworkSDK文档处理来自COM源引发的事件引发COM接收器处理的事件,15.4.6托管和非托管事件,最佳实践,为COM客户端定义一个显式接口,而不生成类接口因为对托管类的改动会改变类接口的布局可以使用ClassInterfaceType.None阻止产生类接口避免缓存DISPID使用ClassInterfaceType.AutoDispatch限制将双绑定接口选项用于类接口,15.4.7最佳实践,回顾,解释在托管代码和非托管代码之间建立互操作的必要性用平台调用服务来调用DLL中的函数用.NET托管代码调用和访问COM对象的方法和属性使用类型导入程序(Tlbimp.exe)从类型库产生元数据用COM客户端调用.NETFramework类的方法使用类型输出程序(Tlbexp.exe)为程序集产生类型库,学习完本章后,将能够:,随堂练习1,编写代码使用DLLImport属性声明方法使得puts函数在.NETFramework应用程序中可用(多选)ADllImport(msvcrt.dll,CharSet:=CharSet.Ansi)Publicstaticintputs(stringstr);BDllImport(msvcrt.dll,CharSet=CharSet.Ansi)Publicstaticintputs(stringstr);CDllImport(msvcrt.dll,CharSet=CharSet.Ansi)Publicstaticintputs(refstringstr);DDllImport(msvcrt.dll,CharSet:=CharSet.Ansi)Publicstaticintputs(refstringstr),随堂练习2,生成RCW的方法:使用P/Invoke的机制调用通过DLLImport属性声明方法使用TlbImp.exe工具调用使用TlbExp.exe工具调用,随堂练习3,为了防止在类的元数据导出到类型库时生成类的接口,应该设置ClassInterfaceAttribute的Value属性为:ClassInterfaceType.NoneClassInterfaceType.AutoDispatchClassInterface.AutoDualClassInterfaceType.Auto,随堂练习4,当COM应用程序要使用.NETFramework类时:COM客户端不能引用一个.NETFramework对象,所以必须重新开发实现为.NETFramework类生成CCW来允许已存在的COM应用程序透明地使用托管代码为.NET
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 摆摊营销全套方案
- 定投营销方案
- 国庆工作施工方案
- 健康餐饮活动方案策划
- 灰色公司营销方案
- 餐厅整修施工方案
- 限时清仓活动方案策划
- 学校营销分化方案
- 聚氨酯堵漏施工方案
- 销售合同审核清单条款审查与风险评估版
- 账号买卖交易合同范本
- 市委2025年履行全面从严治党主体责任工作报告
- 企业内部管理培训资料
- 企业校园招聘的问题与对策研究
- 2025年贵州乐理考试题目及答案
- 儿科护士长述职报告
- 精神科规培基地工作汇报
- 2025年商业地产行业商业地产数字化运营与商业模式研究报告及未来发展趋势
- 电子商务客户数据分析及应用培训教材
- 2025年行政执法人员考试题库(附参考答案)
- 2025年秋季中国南水北调集团青海有限公司招聘42人考试笔试备考试题及答案解析
评论
0/150
提交评论