基于C#的接口基础教程之六
|
源代码网整理以下 第六节、接口转换 源代码网整理以下 C#中不仅支持.Net 平台,而且支持COM平台。为了支持 COM和.Net,C# 包含一种称为属性的独特语言特性。一个属性实际上就是一个 C# 类,它通过修饰源代码来提供元信息。属性使 C# 能够支持特定的技术,如 COM 和 .Net,而不会干扰语言规范本身。C# 提供将COM接口转换为 C#接口的属性类。另一些属性类将 COM类转换为C# 类。执行这些转换不需要任何 IDL 或类工厂。 源代码网整理以下 现在部署的任何COM 组件都可以在接口转换中使用。通常情况下,所需的调整是完全自动进行的。 源代码网整理以下 特别是,可以使用运行时可调用包装 (RCW) 从 .NET 框架访问 COM 组件。此包装将 COM 组件提供的 COM 接口转换为与 .NET 框架兼容的接口。对于 OLE 自动化接口,RCW 可以从类型库中自动生成;对于非 OLE 自动化接口,开发人员可以编写自定义 RCW,手动将 COM 接口提供的类型映射为与 .NET 框架兼容的类型。 源代码网整理以下 使用ComImport引用COM组件 源代码网整理以下 1、创建 COM 对象。 源代码网整理以下 2、确定 COM 接口是否由对象实现。 源代码网整理以下 3、调用 COM 接口上的方法。 源代码网整理以下 4、实现可由 COM 客户端调用的对象和接口。 源代码网整理以下 创建 COM 类包装 源代码网整理以下 要使 C# 代码引用COM 对象和接口,需要在 C# 中包含 COM 接口的定义。完成此操作的最简单方法是使用 TlbImp.exe(类型库导入程序),它是一个包括在 .NET 框架 SDK 中的命令行工具。TlbImp 将 COM 类型库转换为 .NET 框架元数据,从而有效地创建一个可以从任何托管语言调用的托管包装。用 TlbImp 创建的 .NET 框架元数据可以通过 /R 编译器选项包括在 C# 内部版本中。如果使用 Visual Studio 开发环境,则只需添加对 COM 类型库的引用,将为您自动完成此转换。 源代码网整理以下 TlbImp 执行下列转换: 源代码网整理以下 1、COM coclass 转换为具有无参数构造函数的 C# 类。 源代码网整理以下 2、COM 结构转换为具有公共字段的 C# 结构。 源代码网整理以下 检查 TlbImp 输出的一种很好的方法是运行 .NET 框架 SDK 命令行工具 Ildasm.exe(Microsoft 中间语言反汇编程序)来查看转换结果。 源代码网整理以下 虽然 TlbImp 是将 COM 定义转换为 C# 的首选方法,但也不是任何时候都可以使用它(例如,在没有 COM 定义的类型库时或者 TlbImp 无法处理类型库中的定义时,就不能使用该方法)。在这些情况下,另一种方法是使用 C# 属性在 C# 源代码中手动定义 COM 定义。创建 C# 源映射后,只需编译 C# 源代码就可产生托管包装。 源代码网整理以下 执行 COM 映射需要理解的主要属性包括: 源代码网整理以下 1、ComImport:它将类标记为在外部实现的 COM 类。 源代码网整理以下 2、Guid:它用于为类或接口指定通用唯一标识符 (UUID)。 源代码网整理以下 3、InterfaceType,它指定接口是从 IUnknown 还是从 IDispatch 派生。 源代码网整理以下 4、PreserveSig,它指定是否应将本机返回值从 HRESULT 转换为 .NET 框架异常。 源代码网整理以下 COM coclass 在 C# 中表示为类。这些类必须具有与其关联的 ComImport 属性。下列限制适用于这些类: 源代码网整理以下 1、类不能从任何其他类继承。 源代码网整理以下 2、类不能实现任何接口。 源代码网整理以下 4、类还必须具有为其设置全局唯一标识符 (GUID) 的 Guid 属性。 源代码网整理以下 以下示例在 C# 中声明一个 coclass: 源代码网整理以下// 声明一个COM类 FilgraphManager 源代码网整理以下 C# 编译器将添加一个无参数构造函数,可以调用此构造函数来创建 COM coclass 的实例。 源代码网供稿. |
