匯出的組件轉換
任何將組件匯出至型別程式庫的工具或 API,都必須先轉換最外層的 Managed 組件。 處理序會將每一個個別組件轉換成單一型別程式庫,在組件和型別程式庫之間採用一對一的對應。 您不能將一個組件分割成好幾個型別程式庫。 不論轉換的細節或方式如何,一個組件會相當一致地產生同樣的型別程式庫。
組件識別是由下表中所列的四個項目構成。
項目 |
描述 |
---|---|
名稱 |
用來識別組件的字串。 通常,這個字串與不含附檔名的組件檔案名稱相同 |
公開金鑰 |
公開/私密密碼編譯金鑰組 (Key Pair) 的公開部分 |
版本 |
由主要、次要、組建和修訂編號四個部分構成的數字字串 |
文化特性字串 |
組件支援的地區設定 (Locale) |
組合在一起之後,這些欄位就構成了識別組件的強式名稱。
.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
您可以套用 GuidAttribute,來明確設定 LIBID。
轉換處理序也會將版本資訊從組件傳遞到型別程式庫,不過型別程式庫只含有兩個部分的版本號碼,而組件則含有四個部分的版本號碼。 組件的主要和次要版本號碼會被轉送到型別程式庫。 組件的組建編號 (Build Number) 會在轉換中被捨棄,這表示只有組建編號不同的兩個組件,永遠會產生一樣的型別程式庫。 以 0 表示主號和次號 (0.0.X.X) 的組件會產生版本號碼為 1.0 的型別程式庫。
一般而言,從多個組件版本產生的型別程式庫,其內容是無法保證的。 在某個特定程式庫 1.0 版中定義的型別,不保證一定會在相同程式庫的第二版中。
組件的地區設定識別項字串 (例如 us-en) 會轉換成 LCID,並且儲存在型別程式庫中的 LCID 欄位。 如果組件中沒有地區設定識別項字串,匯出處理序會將 LCID 設定為 0。
組件名稱常會含有句號,這在型別程式庫名稱中是不允許的。 匯出處理序會將組件名稱欄位中的句號轉換成底線。
如果已在設計階段套用至組件,匯出處理序會將 AssemblyDescriptionAttribute 複製到與型別程式庫關聯的 helpstring 或 DocString。 型別程式庫中的 HelpFile 欄位或 HelpContext 欄位都未設定。 型別程式庫中的 LIBFLAGS 也都沒有設定。
其他組件欄位 (例如 Processor、OSInformation、CodeBase、Alias、AssemblyHash、Configuration 和 Flags) 都會在轉換期間捨棄。
匯出處理序不會設定 hidden、restricted 及 control 這類型別程式庫屬性。