【大学课件】基于C#的NET Framework程序设计_第1页
【大学课件】基于C#的NET Framework程序设计_第2页
【大学课件】基于C#的NET Framework程序设计_第3页
【大学课件】基于C#的NET Framework程序设计_第4页
【大学课件】基于C#的NET Framework程序设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于基于C#的的 .NET Framework程序设计程序设计 n第第1章章 Microsoft .NET Framework概述概述 n第第2章章 托管执行环境的介绍托管执行环境的介绍 n第第3章章 使用组件使用组件 n第第4章章 部署与版本控制部署与版本控制 n第第5章章 通用类型系统通用类型系统 n第第6章章 类型的使用类型的使用 n第第7章章 字符串、数组和集合字符串、数组和集合 n第第8章章 委托和事件委托和事件 n第第9章章 内存和资源管理内存和资源管理 n第第10章章 数据流和文件数据流和文件 n第第11章章 Internet访问访问 n第第12章章 序列化序列化 n第第13章章

2、 远程处理和远程处理和XML Web Service n第第14章章 线程和异步编程线程和异步编程 n第第15章章 托管代码与非托管代码托管代码与非托管代码 之间的互操作之间的互操作 n第第16章章 使用使用Microsoft ADO.NET 访问数据访问数据 n第第17章章 属性属性 第第15章章 托管代码与非托管代码之间的互操作托管代码与非托管代码之间的互操作 n集成效劳集成效劳 n平台调用平台调用 n在托管代码中调用在托管代码中调用COM对象对象 n在在COM对象中调用对象中调用.NET对象对象 集成效劳集成效劳 n平台调用介绍平台调用介绍 n介绍介绍COM的互操作性的互操作性 nInt

3、erop 封送处理概述封送处理概述 15.1 集成效劳集成效劳 平台调用介绍平台调用介绍 n允许托管代码调用在允许托管代码调用在DLL中实现的非托管方法中实现的非托管方法 n为以下功能提供机制为以下功能提供机制 n定位实现指定函数的定位实现指定函数的DLL,加载,加载DLL到内存中到内存中 n发现和调用非托管函数发现和调用非托管函数 n在托管和非托管代码之间进行参数的封送处理在托管和非托管代码之间进行参数的封送处理 15.1.1 平台调用介绍平台调用介绍 介绍介绍COM的互操作性的互操作性 nCOM和和 .NET的不同之处的不同之处 n生命期管理生命期管理 nCOM:引用计数:引用计数 对对

4、.NET: 垃圾回收垃圾回收 n效劳发现效劳发现 nCOM:查询接口:查询接口 对对 .NET:反射:反射 n对象内存对象内存 nCOM:固定的:固定的 对对 .NET: 可以移动的可以移动的 n运行库可调用包装运行库可调用包装 (RCW) n使用托管客户端调用使用托管客户端调用COM对象上的方法对象上的方法 nCOM可调用包装可调用包装 (CCW) n使用使用COM客户端调用托管对象上的方法客户端调用托管对象上的方法 15.1.2 介绍介绍COM的互操作性的互操作性 Interop 封送处理概述封送处理概述 n互操作封送处理控制在方法调用时如何在托管和互操作封送处理控制在方法调用时如何在托管

5、和 非托管内存间传递数据非托管内存间传递数据 n互操作封送处理是互操作封送处理是CLR封送处理效劳执行的运行时封送处理效劳执行的运行时 活动活动 n Blittable数据类型对托管和非托管内存是一样的,数据类型对托管和非托管内存是一样的, 不需要转换数据类型不需要转换数据类型C#关键字关键字 nSystem.Byte (byte)System.SByte (sbyte) nSystem.Int16 (short)System.UInt16 (ushort) nSystem.Int32 (int)System.UInt32 (uint) nSystem.Int64 (long) System.

6、IntPtr System.UIntPtr n 15.1.3 Interop 封送处理概述封送处理概述 Interop 封送处理概述续封送处理概述续 nNon-blittable 类型是那些在托管和非托管内存具有类型是那些在托管和非托管内存具有 不同表现的类型,需要进行转换不同表现的类型,需要进行转换 n例如,托管字符串就是例如,托管字符串就是non-blittable类型类型 n标准标准RCW和和CCW通常为跨通常为跨COM和和.NET边界调用提供边界调用提供 了适宜的封送处理了适宜的封送处理 n可以使用自定义属性选择性地调整运行库表示托可以使用自定义属性选择性地调整运行库表示托 管和非托管

7、代码的形式管和非托管代码的形式 15.1.3 Interop 封送处理概述封送处理概述 n集成效劳集成效劳 n平台调用平台调用 n在托管代码中调用在托管代码中调用COM对象对象 n在在COM对象中调用对象中调用.NET对象对象 第第15章章 托管代码与非托管代码之间的互操作托管代码与非托管代码之间的互操作 平台调用平台调用 n平台调用工作方式平台调用工作方式 n从托管代码中调用从托管代码中调用 Win32 API n调用非托管函数调用非托管函数 n钉住操作钉住操作 n封送处理封送处理 n平台调用的性能问题及局限性平台调用的性能问题及局限性 15.2 平台调用平台调用 平台调用工作方式平台调用工

8、作方式 n平台调用工作过程平台调用工作过程 l定位包含被调用方法的DLL l把该DLL加载到内存 l查找函数在内存中的地址并将其参数压入堆栈,以封送 所需的数据 l把控制权移交给非托管函数 15.2.1 平台调用工作方式平台调用工作方式 平台调用工作方式续平台调用工作方式续 15.2.1 平台调用工作方式平台调用工作方式 从托管代码中调用从托管代码中调用Win32 API n用用static和和extern C#关键字声明方法关键字声明方法 n导入实现非托管函数的导入实现非托管函数的DLL 15.2.2 从托管代码中调用从托管代码中调用Win32 API DllImport(, EntryPo

9、int=, CharSet= 从托管代码中调用从托管代码中调用Win32 API续续 n用自定义封送处理信息来覆盖用自定义封送处理信息来覆盖 .NET Framework提供提供 默认的封送处理默认的封送处理 参数参数描述描述 EntryPoint指定DLL的入口点,默认是托管代码中指定的名字。如 MessageBox CharSet控制字符串被封送到函数的方式。默认是CharSet.Ansi ExactSpelling根据提供的字符集防止入口点被改变。如果指定了 CharSet.Auto, 默认是 False。 否则, 默认是True CallingConvention指定在传递方法参数所要

10、使用的调用约定值, 默认为 Winapi PreserveSig在平台调用的调用过程中,通常会发生HRESULT或retval 签 名转换,而PreserveSig对象字段则可以防止发生这种转 换。此字段的默认值为True SetLastError控制调用方能否调用 Win32 API 函数 Marshal.GetLastWin32Error, 以确定在执行该函数时是否出错。VB.NET默认为True, C#和C+默认为False 15.2.2 从托管代码中调用从托管代码中调用Win32 API 调用非托管函数调用非托管函数 有两种方法可调用非托管有两种方法可调用非托管DLL中的方法中的方法

11、n使用使用DLLImport属性属性 l导入命名空间 l声明一个静态方法来调用非托管方法,不用提供方法实 现 l使用DllImport属性标注方法,指定输出非托管方法的DLL的 名称 15.2.3 调用非托管函数调用非托管函数 using System.Runtime.InteropServices; DllImport(msvcrt.dll, CharSet=CharSet.Ansi) public static extern int puts(String str); 钉住操作钉住操作 n数据被临时锁定在当前内存位置,防止被数据被临时锁定在当前内存位置,防止被CLR的垃的垃 圾回收器重新分

12、配圾回收器重新分配 n数据在托管和非托管代码之间传递时,执行锁定操数据在托管和非托管代码之间传递时,执行锁定操 作作 n如果对象有固定的布局,在托管和非托管内存中数如果对象有固定的布局,在托管和非托管内存中数 据表现形式一样,那么通过指针进行封送据表现形式一样,那么通过指针进行封送 n有固定布局,但数据在托管和非托管内存中表现不有固定布局,但数据在托管和非托管内存中表现不 一致,通过引用来封送一致,通过引用来封送 n如果对象没有固定的布局,通过值或者引用传递,如果对象没有固定的布局,通过值或者引用传递, 如和对象如和对象 15.2.4 钉住操作钉住操作 封送处理封送处理 n大多数数据类型在托管

13、和非托管内存中都有公共大多数数据类型在托管和非托管内存中都有公共 的表示形式,而不需要封送拆收器的特殊处理,的表示形式,而不需要封送拆收器的特殊处理, 称为可直接复制到本机结构中的类型称为可直接复制到本机结构中的类型 n非直接复制到本机结构中的类型在托管和非托管非直接复制到本机结构中的类型在托管和非托管 语言中具有不同的或不明确的表示形式。当被封语言中具有不同的或不明确的表示形式。当被封 送时,这些类型可能需要转换送时,这些类型可能需要转换 n用用MarshalAs属性来指定自定义封送处理属性来指定自定义封送处理 15.2.5 封送处理封送处理 public static extern int

14、 MessageBoxW( int h, MarshalAs(UnmanagedType.LPWStr) string m, ); 平台调用的性能问题及局限性平台调用的性能问题及局限性 n平台调用只支持带整数参数的回调函数平台调用只支持带整数参数的回调函数 n平台调用不对所有类型提供支持平台调用不对所有类型提供支持 n平台调用只支持调用从平台调用只支持调用从DLL导出的全局函数导出的全局函数 n当以引用传递数组类型的参数时,返回的数组大当以引用传递数组类型的参数时,返回的数组大 小被调整为小被调整为 1 15.2.6 平台调用的性能问题及局限性平台调用的性能问题及局限性 实验实验A 调用调用

15、Win32 API 函数函数 练习练习1 在托管代码中调用在托管代码中调用 Win32 API 函数函数 n集成效劳集成效劳 n平台调用平台调用 n在托管代码中调用在托管代码中调用COM对象对象 n在在COM对象中调用对象中调用.NET对象对象 第第15章章 托管代码与非托管代码之间的互操作托管代码与非托管代码之间的互操作 在托管代码中调用在托管代码中调用COM对象对象 n运行库可调用包装运行库可调用包装 n生成运行库可调用包装生成运行库可调用包装 n线程模型线程模型 n签名转换和错误处理签名转换和错误处理 n封送处理封送处理 n性能和平安问题性能和平安问题 n最正确实践最正确实践 15.3

16、在托管代码中调用在托管代码中调用COM对象对象 运行库可调用包装运行库可调用包装 15.3.1 运行库可调用包装运行库可调用包装 生成运行库可调用包装生成运行库可调用包装 n用如下用如下3个方法产生运行库可调用包装个方法产生运行库可调用包装 n在在Visual Studio .NET工程中添加工程中添加COM组件的引用组件的引用 n使用类型库导入器使用类型库导入器 n创立自定义包装创立自定义包装 15.3.2 生成运行库可调用包装生成运行库可调用包装 线程模型线程模型 nCOM组件使用单元来同步对托管资源的访问组件使用单元来同步对托管资源的访问 n当调用当调用COM对象时,运行库创立并初始化一

17、个对象时,运行库创立并初始化一个 COM单元单元 n确保应用程序的主线程是确保应用程序的主线程是 STA 模式模式 15.3.3 线程模型线程模型 using System.Threading; using APTOBJLib; Thread.CurrentThread.ApartmentState = ApartmentState.STA; AptSimple obj = new AptSimple (); obj.Counter = 1; STAThread static void Main() 签名转换和错误处理签名转换和错误处理 15.3.4 签名转换和错误处理签名转换和错误处理 封送

18、处理封送处理 n对于将数据封送处理到对于将数据封送处理到COM和从和从COM中封送处理数中封送处理数 据的支持是广泛的,并几乎总是提供正确的封送据的支持是广泛的,并几乎总是提供正确的封送 处理行为处理行为 n表格显示了表格显示了C#类型和相应类型和相应COM类型的比较类型的比较 n用用MarshalAsAttribute属性来改变数据封送行为属性来改变数据封送行为 n用两种方法自定义用两种方法自定义RCW来处理类型来处理类型 n编辑互操作程序集编辑互操作程序集 n手动创立包装类手动创立包装类 15.3.5 封送处理封送处理 public void M1 (MarshalAs(Unmanaged

19、Type.LPWStr)String msg); 性能和平安问题性能和平安问题 n托管和非托管互操作时的转换会造成每次调用托管和非托管互操作时的转换会造成每次调用10到到 40个指令的系统消耗个指令的系统消耗 n限制代码中出现的转换次数限制代码中出现的转换次数 n一次进行多个一次进行多个API调用调用 n在创立在创立COM对象前,设置对象前,设置ApartmentState来阻止代理来阻止代理 和存根的创立和存根的创立 n对可信任代码,当托管代码调用非托管代码时,对可信任代码,当托管代码调用非托管代码时, 使用使用SuppressUnmanagedCodeSecurity属性防止平安属性防止平

20、安 检查检查 15.3.6 性能和平安问题性能和平安问题 最正确实践最正确实践 n使用来检查已产生程序集的命名空间和类的名称使用来检查已产生程序集的命名空间和类的名称 n在或者在或者C+的引用参数在将产生一个用的引用参数在将产生一个用ref关键字修关键字修 饰的参数饰的参数 15.3.7 最正确实践最正确实践 实验实验B 调用调用 COM 对象对象 练习练习1 在托管代码中调用在托管代码中调用COM对象对象 n集成效劳集成效劳 n平台调用平台调用 n在托管代码中调用在托管代码中调用COM对象对象 n在在COM对象中调用对象中调用.NET对象对象 第第15章章 托管代码与非托管代码之间的互操作托

21、管代码与非托管代码之间的互操作 从从COM对象中调用对象中调用.NET对象对象 nCOM可调用包装可调用包装 n导出过程导出过程 n在系统注册表中注册在系统注册表中注册.NET Framework类类 n使用使用 ClassInterfaceAttribute n在在COM中使用中使用.NET Framework 类型类型 n托管和非托管事件托管和非托管事件 n最正确实践最正确实践 15.4 从从COM对象中调用对象中调用.NET对象对象 COM可调用包装可调用包装 15.4.1 COM可调用包装可调用包装 导出过程导出过程 n程序集中的任何公有类都被转换为类型库中的程序集中的任何公有类都被转

22、换为类型库中的 coclass n将显式实现的接口输出到类型库将显式实现的接口输出到类型库 托管代码托管代码 类型库类型库 15.4.2 导出过程导出过程 public interface IShape void Draw(); void Move(int x, int y); class Circle : IShape void Draw(); void Move(int x, int y); void Enlarge(int x); uuid(), dual, odl, oleautomation interface IShape : IDispatch HRESULT Draw(); H

23、RESULT Move(int x, int y); uuid() coclass Circle interface IShape; 在系统注册表中注册在系统注册表中注册.NET Framework类类 n使用在系统注册表中注册使用在系统注册表中注册.NET Framework类类 n注册注册.NET Framework类会在系统类会在系统 注册表中添加如下注册表中添加如下 注册项注册项 lHkey_Classes_RootCLSID注册键中.NET Framework类的CLSID l两个存根键:HKCRCLSIDclass_ID键下的 Implemented Categories和Inpr

24、ocServer32 nHKCRCLSID 键的默认值为类的键的默认值为类的 ProgID nInprocServer32 默认被设置为包含公共语言运行库默认被设置为包含公共语言运行库 的的DLL的名称的名称 15.4.3 在系统注册表中注册在系统注册表中注册.NET Framework类类 使用使用 ClassInterfaceAttribute n类接口提供类接口提供.NET Framework对象显式公开的所有公对象显式公开的所有公 共方法、属性、字段和事件共方法、属性、字段和事件 n 阻止创立类阻止创立类 接口接口 n 创创 立一个立一个 dispatch 接口接口 n 创立一创立一 个双绑定接口个双绑定接口 15.4.4 使用使用ClassInterfaceAttribute 在在COM中使用中使用.NET Framework 类型类型 n在非托管代码中使用在非托管代码中使用.NET Framework类类 n设置对描述设置对描述.NET Framework类的类型库的引用类的类型库的引用 n 在在 中,使用引用对话框来设置引用中,使用引用对话框来设置引用 n 在在 中,使用中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论