大多数 Windows 程序员都熟悉组件对象模型(Component Object Model,COM)。在某程度上,.NET 框架 就是为了替换 COM,但是,系统仍然保留了这个功能,可能就是为了我们的不时之需。Windows 中许多编程接口都公开为 COM 对象,虽然,现在越来越多地有了 .NET 框架等效的可托管对象,但仍有一些并没有等效的可托管对象;另外,还有一些开发商出售的软件是通过 COM 公开编程接口的。
设计 .NET 框架就是为了能够和 COM 进行很好地互操作的,因此,调用 COM 组件通常是相当简单的。调用 COM 组件总是通过可托管的包装(wrapper)完成的,由它处理调用非托管的代码。生成包装使用工具 TlbImp.exe,称为类型库导入器(Type Library Importer)随 .NET SDK 一起发行。
然而,尽管有 TlbImp.exe,但是,如果你发现需要 COM 组件时,首先应该去检查是否有开发商提供了可托管的包装,称为首选的互操作程序集(Primary Interop Assemblies)。更多有关首选的互操作程序集的内容,参见下一节“使用 COM 风格的编程接口”。
但是,有时还是需要直接使用 TlbImp.exe。幸运的是,这很简单,所有要做的是把包含 COM 组件的 .dll 的路径传给 TlbImp.exe,可托管的包装就产生在当前目录下。如果想为 Microsoft Speech API 创建可托管的包装,就使用下面的命令:
let main() =
// create an new instance of a com class
// (these almost always end with "Class")
let voice = new SpVoiceClass()
// call a method Speak, ignoring the result
voice.Speak("Hello world", SpeechVoiceSpeakFlags.SVSFDefault) |> ignore