日常收集C#接口知识(知识全面)

2019-12-30 11:28:58王旭

  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

  COM coclass 在 C# 中表示为类。这些类必须具有与其关联的 ComImport 属性。下列限制适用于这些类:
  1、类不能从任何其他类继承。
  2、类不能实现任何接口。
  4、类还必须具有为其设置全局唯一标识符 (GUID) 的 Guid 属性。

  以下示例在 C# 中声明一个 coclass:


// 声明一个COM类 FilgraphManager
[ComImport, Guid("E436EBB3-524F-11CE-9F53-0020AF0BA770")]
class FilgraphManager
{ }

  C# 编译器将添加一个无参数构造函数,可以调用此构造函数来创建 COM coclass 的实例。

  创建 COM 对象

  COM coclass 在 C# 中表示为具有无参数构造函数的类。使用 new 运算符创建该类的实例等效于在 C# 中调用 CoCreateInstance。使用以上定义的类,就可以很容易地实例化此类:


 class MainClass
 {
 public static void Main()
 {
 FilgraphManager filg = new FilgraphManager();
 }
 } 

  声明 COM 接口

  COM 接口在 C# 中表示为具有 ComImport 和 Guid 属性的接口。它不能在其基接口列表中包含任何接口,而且必须按照方法在 COM 接口中出现的顺序声明接口成员函数。

  在 C# 中声明的 COM 接口必须包含其基接口的所有成员的声明,IUnknown 和 IDispatch 的成员除外(.NET 框架将自动添加这些成员)。从 IDispatch 派生的 COM 接口必须用 InterfaceType 属性予以标记。