COM 类型定义通常驻留在类型库中。 相比之下,符合 CLS 的编译器在程序集中生成类型元数据。 类型信息的两个源大相径庭。 本主题介绍从类型库生成元数据的技术。 生成的程序集称为互作程序集,并且它包含的类型信息使 .NET Framework 应用程序能够使用 COM 类型。
可通过两种方法向应用程序提供此类型信息:
使用仅限设计时的互操作程序集:从 .NET Framework 4 开始,您可以指示编译器将互操作程序集中的类型信息嵌入到可执行文件中。 编译器仅嵌入应用程序使用的类型信息。 无需将互作程序集与应用程序一起部署。 这是建议的技术。
部署互作程序集:可以创建对互作程序集的标准引用。 在这种情况下,互操作程序集必须与应用程序一起部署。 如果使用此方法,并且未使用专用 COM 组件,请始终引用要合并到托管代码中的 COM 组件的作者发布的主互作程序集(PIA)。 有关生成和使用主互作程序集的详细信息,请参阅 主互作程序集。
使用仅设计时使用的互操作程序集时,可以从由 COM 组件作者发布的主互操作程序集嵌入类型信息。 您不必随您的应用程序部署主要互操作程序集。
使用仅设计时互作程序集可减少应用程序的大小,因为大多数应用程序不使用 COM 组件的所有功能。 编译器在嵌入类型信息时非常高效;如果应用程序仅在 COM 接口上使用某些方法,编译器不会嵌入未使用的方法。 当具有嵌入类型信息的应用程序与另一个此类应用程序交互,或者与使用主互作程序集的应用程序交互时,公共语言运行时使用类型等效规则来确定两个具有相同名称的类型是否表示同一 COM 类型。 不必知道这些规则才能使用 COM 对象。 但是,如果对规则感兴趣,请参阅 类型等效和嵌入式互作类型。
生成元数据
COM 类型库可以是具有 .tlb 扩展名的独立文件,例如 Loanlib.tlb。 某些类型库嵌入 .dll 或 .exe 文件的资源部分中。 其他类型库信息的源是 .olb 和 .ocx 文件。
找到包含目标 COM 类型的实现的类型库后,可以使用以下选项生成包含类型元数据的互作程序集:
Visual Studio
Visual Studio 自动将类型库中的 COM 类型转换为程序集中的元数据。 有关说明,请参阅 如何:添加对类型库的引用。
-
类型库导入程序提供命令行选项来调整生成的互作文件中的元数据,从现有类型库导入类型,并生成互作程序集和命名空间。 有关说明,请参阅 如何:从类型库生成互作程序集。
System.Runtime.InteropServices.TypeLibConverter 类
此类提供将类型库中的组件类和接口转换为程序集中的元数据的方法。 它生成与 Tlbimp.exe相同的元数据输出。 但是,与 Tlbimp.exe不同,类 TypeLibConverter 可以将内存中类型库转换为元数据。
自定义包装器
当类型库不可用或不正确时,一个选项是在托管源代码中创建类或接口的重复定义。 然后,使用面向运行时的编译器编译源代码,以在程序集中生成元数据。
若要手动定义 COM 类型,必须有权访问以下项:
所定义的组件类和接口的精确描述。
编译器(如 C# 编译器)可以生成相应的 .NET Framework 类定义。
对类型库到程序集转换规则的了解。
编写自定义包装器是一种高级技术。 有关如何生成自定义包装器的其他信息,请参阅 自定义标准包装器。
有关 COM 互作导入过程的详细信息,请参阅 类型库到程序集转换摘要。