向 .NET Compact Framework 组件公开 COM
更新:2007 年 11 月
从 .NET Compact Framework 2.0 版开始,您可以从托管代码调用 COM 对象。您还可以使用由 .NET Framework 全功能版提供的类型库导入程序 (Tlbimp.exe) 导入类型库;或者,在 Visual Studio 中,您可以向您的项目添加类型库引用。导入的类型库又叫做互操作程序集,因为它包含元数据中所述的 COM 类型的定义。
如果最初在托管代码中分配的本机代码中的内存在本机函数调用返回后仍然由本机代码库存储,那么本机库对象必须固定在托管代码中,这样垃圾回收器就不会移动或回收它。您可以使用 GCHandle 结构来固定该对象。
托管代码必须负责根据为本机操作系统指定的正确字节边界排列数据类型,此过程称为封装过程。
有三个从 .NET Compact Framework 调用 COM 对象的任务:
创建 COM 接口和类型的托管定义。
从您的项目引用这些定义。
将您的 COM 接口和类型用作托管类型。
您还可以为托管定义“手动编写代码”。
引用互操作程序集
互操作程序集是导入的类型库,其中包含由类型库导入程序或 Visual Studio 生成的元数据中所描述的 COM 类型的定义。
若要在生成项目时引用互操作程序集,请在使用命令行编译器时使用 /r: 开关。当您在 Visual Studio 中向类型库添加引用时,就为您完成了此操作。
将 COM 类型用作托管类型
导入期间会将默认接口的成员添加到类。将自动处理 IDispatch 及 IUnknown 调用、QueryInterface 和 COM 引用计数。失败 HRESULT 值将自动映射到异常。
当导入一个 COM 类型后,您可以在编程任务中像使用任何其他托管类型一样来使用 COM 类型。下面列举一些编程任务的例子:
使用 new 关键字(在 Visual Basic 中为 New)创建实例。
捕捉异常。
通过类直接调用。
避免在 IDispatch 样式调用与 IUnknown 样式调用之间进行选择。
根据需要强制转换为特定接口。