导出程序集转换
更新:2007 年 11 月
任何将程序集导出到类型库的工具或 API 都必须首先转换托管程序集最外层的内容。此过程将各个程序集转换为单个类型库,从而在程序集和类型库之间施加一对一的映射。一个程序集不能拆分为多个类型库。无论转换的详细信息或方式如何,一个程序集始终会生成同一个类型库。
程序集和类型库标识
程序集标识由下表所列的四个元素组成。
元素 |
说明 |
---|---|
名称 |
用于标识程序集的字符串。通常,此字符串与不带扩展名的程序集文件名相同。 |
公钥 |
公共/私有密钥对的公共部分。 |
版本 |
由四部分构成的数字字符串,其中包括主版本号、次版本号、内部版本号和修订版本号。 |
区域性字符串 |
程序集所支持的区域设置。 |
这些字段组合在一起构成了用于标识程序集的强名称。
部分程序集清单
.assembly Sample as "Sample"
{
publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00
00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00
B7 3C 60 FD 2D 6B E4 14 4E BD D1 B6 1A 09 FB F1
23 FF A8 62 59 B3 86 0B 0A 73 10 98 51 E5 0E D6
7E 10 2F A7 6E AF 1B E5 E8 F1 2E E6 9C F7 74 9A
1A 9A 83 88 2C 70 C9 8B 52 AD 97 5C 23 52 D2 42
D2 6C 64 14 E7 1D 1D 55 B4 F4 9C BB 86 7B 07 99
E3 19 E8 E1 4A BC 7A 40 A6 A2 9D AD 96 9B E5 CA
7C 10 5B 79 16 80 29 50 CD C3 63 D0 12 81 D0 18
B4 AE DA EC CC ED 8E AF A4 08 14 05 C6 9C 7B C5)
.ver 1:0:295:37445
.locale = (65 00 6E 00 2D 00 55 00 53 00 00 00 ) // en-US
}
对比而言,类型库标识由三个元素组成:类型库标识符 (LIBID)、版本和区域设置标识符 (LCID)。包含类型信息的文件的名称和在类型库中定义的友好名称都不是类型库标识的一部分。您可以使用 LIBID、版本和 LCID,通过注册表来查找类型库。
类型库表示形式
[ uuid(0D26FC72-7EB1-4565-AA75-DA5F177EFA66),
lcid(0x0409),
version(2.1),
helpstring("Acme Widget Library")
]
library Acme
{
…
};
库标识符 (LIBID)
当导出过程将程序集转换为类型库时,它将保留类型库的标识。每个唯一标识的程序集都将成为一个唯一标识的类型库。为了确保唯一性,转换过程将使用程序集中的名称、版本和公钥来生成 LIBID。
具体地说,该组合将确保:
名称、版本和公钥的组合始终会生成同一个 LIBID。
名称、版本和公钥组合不同的两个程序集决不会生成相同的 LIBID。
可以应用 GuidAttribute 以显式地设置 LIBID。
版本号和内部版本号
虽然类型库只包含由两部分构成的版本号,而程序集包含由四部分构成的版本号,转换过程仍会将版本信息从程序集传递给类型库。程序集的主版本号和次版本号将传递到类型库中。程序集的内部版本号将在转换过程中被丢弃,这样,两个仅是内部版本号不同的程序集始终会生成相同的类型库。带有表示主版本号和次版本号的 0 (0.0.X.X) 的程序集将生成带有 1.0 版本号的类型库。
总的说来,不能确保从多个程序集版本中生成的类型库会包含什么内容。在特定库的 1.0 版中定义的类型不一定会存在于同一个库的第二个版本中。
区域设置信息
程序集的区域设置标识符字符串(如 us-en)将转换为 LCID,并存储在类型库的 LCID 字段中。如果程序集中没有区域设置标识符字符串,则导出过程就会将 LCID 设置为 0。
句点转换为下划线
程序集名称中通常包含句点,这在类型库名称中是不允许的。导出过程会将程序集名称字段中的句点转换为下划线。
Helpstring
如果 AssemblyDescriptionAttribute 在设计时应用于程序集,导出过程会将其复制到与类型库相关联的 helpstring 或 DocString。对于类型库中的 HelpFile 字段和 HelpContext 字段,均不会进行设置。也不会设置类型库中的所有 LIBFLAGS。
其他程序集字段
其他程序集字段,如 Processor、OSInformation、CodeBase、Alias、AssemblyHash、Configuration 和 Flags,将在转换过程中被丢弃。
导出过程不设置 hidden、restricted 和 control 等类型库属性。