• 当前位置:首页>>C#语言>>C#基础教程>>C# 程序员参考--COM Interop 第一部分:C# 客户端教程
  • C# 程序员参考--COM Interop 第一部分:C# 客户端教程
  • COM Interop 提供对现有 COM 组件的访问,而不需要修改原始组件。若要将 COM 代码合并到托管应用程序,请通过使用 COM Interop 实用工具 (TlbImp.exe) 导入相关的 COM 类型。一经导入,COM 类型就可以使用。

    此外,COM Interop 还使 COM 开发人员能够像访问其他 COM 对象一样轻松访问托管对象。同样,COM Interop 提供了一个专用实用工具 (RegAsm.exe),此工具将托管类型导出到类型库中,并将托管组件注册为传统 COM 组件。

    在运行时,公共语言运行库根据需要在 COM 对象和托管对象之间封送数据。

    该教程显示如何使用 C# 与 COM 对象交互操作。

    COM Interop 第二部分:C# 服务器教程讲述如何将 C# 服务器与 C++ COM 客户端一起使用。有关两个教程的概述,请参见 COM Interop 教程。

    教程

    C# 使用 .NET Framework 功能执行 COM Interop。C# 支持:

    • 创建 COM 对象。
    • 确定 COM 接口是否由对象实现。
    • 调用 COM 接口上的方法。
    • 实现可由 COM 客户端调用的对象和接口。

    .NET Framework 使用 COM Interop 处理引用计数问题,因此不必调用或实现 AddRef 和 Release。

    本教程阐述以下主题:

    • 创建 COM 类包装
    • 声明 COM coclass
    • 创建 COM 对象
    • 声明 COM 接口
    • 使用转换而不是 QueryInterface
    • 综述

    创建 COM 类包装

    要使 C# 代码引用 COM 对象和接口,需要在 C# 内部版本中包含 COM 接口的 .NET Framework 定义。完成此操作的最简单方法是使用 TlbImp.exe(类型库导入程序),它是一个包括在 .NET Framework SDK 中的命令行工具。TlbImp 将 COM 类型库转换为 .NET Framework 元数据,从而有效地创建一个可以从任何托管语言调用的托管包装。用 TlbImp 创建的 .NET Framework 元数据可以通过 /R 编译器选项包括在 C# 内部版本中。如果使用 Visual Studio 开发环境,则只需添加对 COM 类型库的引用,将为您自动完成此转换。

    TlbImp 执行下列转换:

    • COM coclass 转换为具有无参数构造函数的 C# 类。
    • COM 结构转换为具有公共字段的 C# 结构。

    检查 TlbImp 输出的一种很好的方法是运行 .NET Framework SDK 命令行工具 Ildasm.exe(Microsoft 中间语言反汇编程序)来查看转换结果。

    虽然 TlbImp 是将 COM 定义转换为 C# 的首选方法,但也不是任何时候都可以使用它(例如,在没有 COM 定义的类型库时或者 TlbImp 无法处理类型库中的定义时,就不能使用该方法)。在这些情况下,另一种方法是使用 C# 属性在 C# 源代码中手动定义 COM 定义。创建 C# 源映射后,只需编译 C# 源代码就可产生托管包装。

    执行 COM 映射需要理解的主要属性包括:

    • ComImport,它将类标记为在外部实现的 COM 类。
    • Guid,它用于为类或接口指定通用唯一标识符 (UUID)。
    • InterfaceType,它指定接口是从 IUnknown 还是从 IDispatch 派生。
    • PreserveSig,它指定是否应将本机返回值从 HRESULT 转换为 .NET Framework 异常。

    这些属性中的每一个都在本教程的某个实际示例的上下文中进行了显示。

    声明 COM coclass

    COM coclass 在 C# 中表示为类。这些类必须具有与其关联的 ComImport 属性。下列限制适用于这些类:

    • 类不能从任何其他类继承。
    • 类不能实现任何接口。
    • 类还必须具有为其设置全局唯一标识符 (GUID) 的 Guid 属性。

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

    // 
    
    // declare FilgraphManager as a COM coclass 
    
    // 
    
    [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() 
    
        {
    
            // 
    
            // Create an instance of a COM coclass - calls
    
            //
    
            // CoCreateInstance(E436EBB3-524F-11CE-9F53-0020AF0BA770, 
    
            //                  NULL, CLSCTX_ALL, 
    
            //                  IID_IUnknown, &f) 
    
            //
    
            // returns null on failure. 
    
            // 
    
            FilgraphManager f = new FilgraphManager(); 
    
        }
    
    }

    声明 COM 接口

    [1] [2] [3] [4] [5] 下一页