运行时可调用包装

公共语言运行时通过名为运行时可调用包装 (RCW) 的代理来公开 COM 对象。 虽然 RCW 在 .NET 客户端看来是普通的对象,但它的主要功能是封送在 .NET 客户端和 COM 对象之间传递的调用。

无论一个 COM 对象存在多少个引用,运行时只为每个 COM 对象创建一个 RCW。 运行时只为每个对象维护一个每进程的 RCW。 如果在一个应用程序域或单元中创建 RCW,然后将引用传递至另外一个应用程序域或单元,则会使用第一个对象的代理。 如下图所示,对于公开 INew 和 INewer 接口的 COM 对象,任意数目的托管客户端都可以持有引用。

通过运行时可调用包装来访问 COM 对象

RCW

利用从类型库中导出的元数据,运行时将创建所调用的 COM 对象和该对象的包装。 每个 RCW 都会在它所包装的 COM 对象上维护一个接口指针缓存,并且在不再需要 RCW 时释放它对该 COM 对象的引用。 运行时将对 RCW 执行垃圾回收。

RCW 的功能之一是代表被包装的对象封送在托管和非托管代码之间传递的数据。 具体地说,只要客户端和服务器之间传递了表示形式不同的数据,RCW 就会为方法参数和方法返回值提供封送处理。

标准的包装会强制实施内置的封送处理规则。 例如,当 .NET 客户端将一个 String 类型作为参数的一部分传递给非托管对象时,包装就会将该 String 类型转换为 BSTR 类型。 如果 COM 对象向其托管调用方返回 BSTR,调用方将接收到 String 类型。 客户端和服务器都会收发它们所熟悉的数据。 其他类型则不需要进行任何转换。 例如,标准的包装将始终在托管和非托管代码之间传递 4 字节的整数,而不会转换其类型。

请参见

概念

COM 包装

封送选定接口

COM 可调用包装

将类型库当作程序集导入

其他资源

有关从类型库转换到程序集的摘要