创建附属程序集

打包和部署资源主题中介绍的轮辐式模型是开发具有资源的应用程序的推荐的设计实现。

轮辐式模型要求您将资源放置在特定位置,以便可以很容易地定位并使用这些资源。 如果您没有按照预期编译和命名资源,或者如果您没有将资源放置在正确的位置,则公共语言运行时将不能定位它们。 在这一情况下,运行时将使用默认资源组。 有关资源名称的更多信息,请参见 CultureInfo 类打包和部署资源

编译附属程序集

使用程序集链接器 (Al.exe) 可以将 .resources 文件编译成附属程序集。 Al.exe 根据您指定的 .resources 文件创建程序集。 根据定义,附属程序集只能包含资源。 它们不能包含任何可执行代码。

以下 Al.exe 命令根据 strings.de.resources 文件创建 MyApp 应用程序的附属程序集。

al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll

以下 Al.exe 命令也根据 strings.de.resources 文件创建 MyApp 应用程序的附属程序集。 /template 选项使附属程序集从父程序集 MyApp.dll 继承程序集元数据。

al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll
/template:MyApp.dll

下表更为详细地说明在这些示例中使用的 Al.exe 选项。

选项

说明

/t:lib

/t 选项指定您的附属程序集被编译成库 (.dll ) 文件。 一个附属程序集不能被执行的原因在于,它不包含代码并且不是应用程序的主程序集。 因此,您必须将附属程序集另存为 DLL。

/embed:strings.de.resources

/embed 选项指定在 Al.exe 编译程序集时使用的源文件的名称。 请注意,您可以将多个 .resources 文件嵌入到一个附属程序集中。 但是,如果您正采用轮辐式模型,则您必须为每一区域性编译一个附属程序集。 不过,您可以为字符串和对象创建单独的 .resources 文件。

/culture:de

/culture 选项指定要编译的资源的区域性。 运行时在搜索指定的区域性的资源时将使用此信息。 如果您省略了这一选项,Al.exe 仍将编译资源,但在用户请求该资源时运行时将不能找到它。

/out:MyApp.resources.dll

/out 选项指定输出文件的名称。 名称必须遵守命名标准 baseName.resources.extension,其中 baseName 是主程序集的名称,而 extension 是适用的扩展名(例如 .dll)。 请注意,运行时不能基于其输出文件名称确定附属程序集的区域性。 因此,用上述 /culture 选项指定区域性是重要的。

/template:filename

/template 选项指定要从其继承所有程序集元数据的程序集,区域性字段除外。 附属程序集继承自的程序集必须具有强名称

有关可用于 Al.exe 的选项的完整列表,请参见程序集链接器 (Al.exe)

编译具有强名称的附属程序集

如果要将附属程序集安装在全局程序集缓存中,附属程序集必须具有强名称。 通过有效的公钥/私钥对签发具有强名称的程序集。 有关强名称的更多信息,请参见具有强名称的程序集

在您开发一个应用程序时,您不见得具有对最终公钥/私钥对的访问权限。 为了将附属程序集安装在全局程序集缓存中并确保它能够按预期要求工作,您可以采用称作延迟签名的技术。 当您延迟签发一个程序集时,您将在文件中留出空间,以用于生成时的强名称签名。 实际签名将被延迟到一个稍晚的日期,即最终公钥/私钥对可用的时候。

获取公钥

若要延迟签发一个程序集,您必须具有对公钥的访问权。 您可以从将进行最终签名的公司的组织中获取真实的公钥,或者使用强名称工具 (Sn.exe) 创建公钥。

下面的 Sn.exe 命令创建一个测试公钥/私钥对,并将其保存在文件 TestKeyPair.snk 中。 –k 选项指定 Sn.exe 创建一个新的密钥对,并将其保存在指定的文件中。

sn –k TestKeyPair.snk 

您可以从包含测试密钥对的文件中提取公钥。 下面的命令从 TestKeyPair.snk 中提取公钥并将其保存在 PublicKey.snk 中。

sn –p TestKeyPair.snk PublicKey.snk

延迟为程序集签名

当您已获取或创建了公钥后,可使用程序集链接器 (Al.exe) 来编译程序集并指定延迟签名。

以下 Al.exe 命令根据 strings.ja.resources 文件为应用程序 MyApp 创建具有强名称的附属程序集。

al /t:lib /embed:strings.ja.resources /culture:ja /out:MyApp.resources.dll /delay+ /keyfile:PublicKey.snk

/delay+ 选项指定延迟签发该程序集。 /keyfile: 选项指定包含用来延迟签发程序集的公钥的密钥文件的名称。

有关延迟签名的更多信息,请参见延迟为程序集签名

请注意,具有强名称的程序集包含版本信息,运行时将使用该信息来确定哪一程序集将用于满足绑定请求。 有关此主题的更多信息,请参见程序集版本控制

重新签发程序集

在某一较晚的日期,必须用实际的密钥对重新签发已延迟签发的附属程序集。 您可以使用 Sn.exe 来执行此类的重新签发。

下面的 Sn.exe 命令使用存储在 RealKeyPair.snk 文件中的实际密钥对签名 MyApp.resources.dll。 –R 选项指定 Sn.exe 重新签名先前已签名的程序集或延迟签名的程序集。

sn –R MyApp.resources.dll RealKeyPair.snk 

将附属程序集安装在全局程序集缓存中

全局程序集缓存是运行时在资源后备进程中搜索资源的第一个位置。 有关更多信息,请参见 打包和部署资源 主题中的“资源后备进程”子主题。 因此,务必要知道如何将资源安装到全局程序集缓存中。 使用强名称编译的附属程序集已经可以安装在全局程序集缓存中。 您可以使用全局程序集缓存工具 (Gacutil.exe) 将程序集安装在该缓存中。

以下 Gacutil.exe 命令将 MyApp.resources.dll 安装到全局程序集缓存中。

gacutil /i:MyApp.resources.dll

/i 选项指定 Gacutil.exe 将指定的程序集安装到全局程序集缓存中。 执行了此命令后,在缓存中将放置一项,这允许访问此 .resources 文件中的各项。 在安装到缓存中之后,经过设计可以使用该指定资源的所有应用程序就可以利用该资源了。

未安装在全局程序集缓存中的附属程序集的目录位置

在您完成附属程序集的编译后,这些程序集都具有相同的名称。 运行时基于在编译时由 Al.exe 的 /culture 选项指定的区域性和每一程序集的目录位置区分它们。 您必须将您的附属程序集放置在适当的目录位置。

下图显示了您未安装在全局程序集缓存中的应用程序的示例目录结构和位置要求。 具有 .txt 和 .resources 文件扩展名的项将不随最终应用程序一起提供。 这些项是用于创建最终附属资源程序集的中间资源文件。 在此示例中,您可以用 .resx 文件代替 .txt 文件。 .resx 文件是可以包含对象的唯一的中间资源文件类型。

附属程序集目录

附属程序集

注意注意

如果您的应用程序包括子区域性的资源,请将每一子区域性放置在其自己的目录中。不要将子区域性放置在其主区域性的目录的子目录中。

请参见

参考

Al.exe(程序集链接器)

Sn.exe(强名称工具)

Gacutil.exe(全局程序集缓存工具)

概念

打包和部署资源

延迟为程序集签名

应用程序中的资源