Al.exe(程序集链接器)

更新:2011 年 4 月

程序集链接器从一个或多个文件(可以是模块,也可以是资源文件)生成一个具有程序集清单的文件。 模块是不含程序集清单的“Microsoft 中间语言”(MSIL) 文件。

注意注意

为了避免受到 Windows Vista 计算机上虚拟化的影响,程序集必须包含一个指定所请求执行级别的 win32 清单。从命令行直接使用 al.exe 时,可以将该清单嵌入 win32 资源文件中或者使用 mt.exe 在生成过程的后期追加该清单。在 Visual Studio 2008 中,C# 和 Visual Basic 编译器都自动将 win32 清单嵌入程序集中。有关更多信息,请参见 /win32manifest(C# 编译器选项)

安装 Visual Studio 和 Windows SDK 时会自动安装此工具。 要运行工具,我们建议您使用 Visual Studio 命令提示符或 Windows SDK 命令提示符(也称 CMD Shell)。 您可以使用这些实用程序轻松运行工具,而不需要导航到安装文件夹。 有关更多信息,请参见 Visual Studio 和 Windows SDK 命令提示

  • 如果您的计算机上已安装了 Visual Studio:在任务栏上依次单击 Start、All Programs、Visual Studio、Visual Studio Tools、Visual Studio Command Prompt。

    - 或 -

    如果您的计算机上已安装了 Windows SDK:在任务栏上依次单击 Start、All Programs、Windows SDK 文件夹和 Command Prompt(或CMD Shell)。

  • 在命令提示处,键入下列命令:

al sources options

参数

您可以指定以下一个或多个 sources。

说明

file[,target]

将 file(模块)的内容复制到 target 指定的文件名。 复制后,Al.exe 将 target 编译为程序集。

/embed[resource]:file[,name[,private]]

将 file 指定的资源嵌入到包含程序集清单的映像中;Al.exe 将 file 的内容复制到可迁移可执行 (PE) 映像中。

name 参数是资源的内部标识符。 默认情况下,资源在程序集中是公共的(对于其他程序集可见)。 指定 private 会使该资源对于其他程序集不可见。

例如,如果 file 是由资源文件生成器 (Resgen.exe) 创建或在开发环境中创建的 .NET Framework 资源文件,则可使用 System.Resources 中的成员来访问它。 有关更多信息,请参见 ResourceManager。 对于所有其他资源,请使用 Assembly 中的 GetManifestResource* 方法在运行时访问资源。

如果只将资源文件传递给 Al.exe,则输出文件会是附属资源程序集。

/link[resource]:file[,name[,target[,private]]]

将资源文件链接到程序集。 file 指定的资源成为程序集的组成部分;不复制该文件。 file 参数可以是任何文件格式。 例如,可以指定本机 DLL 作为 file 参数。 这将使本机 DLL 成为程序集的组成部分,从而可将它安装到全局程序集缓存中,并且可以通过该程序集中的托管代码访问它。 也可以通过使用 /linkresource 编译器选项实现该目的。 有关更多信息,请参见 /linkresource (C# 编译器选项)

name 参数是资源的内部标识符。 target 参数指定 Al.exe 将 file 复制到其中的路径和文件名。复制后,Al.exe 将 target 编译为程序集。 默认情况下,资源在程序集中是公共的(对于其他程序集可见)。 指定 private 会使该资源对于其他程序集不可见。

例如,如果 file 是由资源文件生成器 (Resgen.exe) 创建或在开发环境中创建的 .NET Framework 资源文件,则可使用 System.Resources 命名空间中的成员来访问它。 有关更多信息,请参见 ResourceManager。 对于所有其他资源,请使用 Assembly 类中的 GetManifestResource* 方法在运行时访问资源。

如果只将资源文件传递给 Al.exe,则输出文件会是附属资源程序集。

您可以指定以下 options;您必须指定 /out

选项

说明

/algid:id

指定一种算法以散列多文件程序集中的所有文件,包含程序集清单的文件除外。 默认算法是 CALG_SHA1。 有关其他算法,请参见 Platform SDK 文档中的 ALG_ID。 对于 .NET Framework 的第一版,只有 CALG_SHA1 和 CALG_MD5 是有效的。

哈希值存储在程序集清单的文件表中。 在安装和加载时,会对照相应的哈希值检查程序集文件。

还可以将此选项指定为任何模块的源代码中的自定义特性 (AssemblyAlgorithmIdAttribute)。

/base[address]:addr

指定一个地址,运行时在用户计算机上在该地址加载 DLL。 如果指定 DLL 的基址,而不是让操作系统在进程空间内重新定位 DLL,应用程序的加载速度就会快一些。

/bugreport:filename

创建包含有关报告 bug 的信息的文件 (filename)。

/comp[any]:text

为程序集中的 Company 字段指定字符串。 如果 text 包含空格,则将字符串放置在双引号 (" ") 中。 此字符串是程序集上的自定义特性,可以使用反射进行查看。

如果不指定 /win32res,text 就会在 Microsoft Windows 资源管理器中显示为文件的 Company 属性。 如果指定 /win32res,所指定资源文件中的公司信息就会在 Windows 资源管理器中显示为 Company 属性。

如果文本是空字符串 (""),Win32 Company 资源就会显示为一个空格。

如果指定 /win32res/company 将不会影响 Win32 资源信息。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyCompanyAttribute)。

/config[uration]:text

为程序集中的 Configuration 字段指定字符串。 如果 text 包含空格,则将字符串放置在双引号 (" ") 中。 此字符串是程序集上的自定义特性,可以使用反射进行查看。

如果文本是空字符串,Win32 Configuration 资源就会显示为一个空格。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyConfigurationAttribute)。

/copy[right]:text

为程序集中的 Copyright 字段指定字符串。 如果 text 包含空格,则将字符串放置在双引号 (" ") 中。 此字符串是程序集上的自定义特性,可以使用反射进行查看。

如果不指定 /win32res/copyright 在 Windows 资源管理器中将显示为 Win32 Copyright 资源。

如果文本是空字符串,Win32 Copyright 资源就会显示为一个空格。

如果指定 /win32res/copyright 将不会影响 Win32 资源信息。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyCopyrightAttribute)。

/c[ulture]:text

指定要与程序集相关联的区域性字符串。 区域性的有效值是名为“Tags for the Identification of Languages”(语言标识的标记)的 Internet Requests for Comments (RFC)(Internet 注释请求)文档 1766 定义的那些值。

如果 text 包含空格,则将字符串放置在双引号 (" ") 中。 没有默认的区域性字符串。 使用反射可以查看此字符串。

有关有效的 text 字符串的信息,请参见 CultureInfo

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyCultureAttribute)。

/delay[sign][+|-]

指定程序集是完全签名的还是部分签名的。 如果需要完全签名的程序集,则使用 /delaysign-。 如果仅想将公钥包含在程序集中,则使用 /delaysign+

在请求完全签名的程序集时,Al.exe 散列包含清单(程序集元数据)的文件,并使用私钥对该散列签名。 产生的数字签名存储在包含清单的文件中。 在对程序集延迟签名时,Al.exe 并不计算和存储签名,而只是在文件中保留空间以便以后可以添加签名。

默认值为 /delaysign-

如果不与 /keyfile/keyname 一起使用,/delaysign 选项将无效。

例如,使用 /delaysign+ 将允许测试人员把程序集放入全局缓存中。 测试完成后,可以通过使私钥包含在程序集中对程序集进行完全签名。

注意注意
使用Gacutil.exe(全局程序集缓存工具) 将延迟签名的程序集放入全局缓存中之前,请使用Sn.exe(强名称工具) 注册该程序集,以跳过验证。例如 Sn.exe –Vr delaySignedAssembly。仅将它用于开发。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyDelaySignAttribute)。

/descr[iption]:text

为程序集中的 Description 字段指定一个字符串。 如果 text 包含空格,则将字符串放置在双引号 (" ") 中。 此字符串是程序集上的自定义特性,可以使用反射进行查看。

如果不指定 /win32res/description 在 Windows 资源管理器中就会显示为 Win32 Comments 资源。

如果文本是空字符串,Win32 Comments 资源就会显示为一个空格。

如果指定 /win32res/description 将不会影响 Win32 资源信息。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (Description)。

/e[vidence]:file

使用资源名称 Security.Evidence 将 file 嵌入程序集中。

对常规资源不能使用 Security.Evidence。

/fileversion:version

为程序集中的 File Version 字段指定字符串。 此字符串是程序集上的自定义特性,可以使用反射进行查看。

如果不指定 /win32res/fileversion 就会作为 Win32 File Version 资源使用。 如果不指定 /fileversion,Win32 File Version 资源就会被 Win32 Assembly Version 资源填充。

如果指定 /win32res/fileversion 就不会影响 Win32 资源。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyFileVersionAttribute)。

/flags:flags

为程序集中的 Flags 字段指定一个值。 flags 的可能值有:

0x0000

程序集是相邻兼容的。

0x0010

该程序集无法与其他版本在相同的应用程序域中一起执行。

0x0020

该程序集无法与其他版本在同一进程中一起执行。

0x0030

程序集无法与其他版本在同一计算机上一起执行。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyFlagsAttribute)。

/fullpaths

使 Al.exe 对在错误信息中报告的任何文件使用绝对路径。

/help

显示该工具的命令语法和选项。

/keyf[ile]:filename

指定一个文件 (filename),该文件包含密钥对,或只包含用于对程序集进行签名的公钥。 编译器在程序集清单中插入公钥,然后使用私钥对最终的程序集进行签名。 有关生成密钥文件和将密钥对安装到密钥容器中的信息,请参见强名称工具 (Sn.exe)

如果使用延迟签名,此文件通常会具有公钥而不是私钥。

(密钥对的)公钥信息显示在程序集的 .publickey 字段中。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyKeyFileAttribute)。

如果在同一编译中同时指定了 /keyfile/keyname(通过命令行选项或者通过自定义特性),Al.exe 将首先尝试用 /keyname 指定的容器。 如果成功,则使用密钥容器中的信息对程序集签名。 如果 Al.exe 没有找到密钥容器,它将尝试由 /keyfile 指定的文件。 如果成功,则使用密钥文件中的信息对程序集签名,并且将密钥信息安装到密钥容器中(类似于 Sn.exe 中的 -i 选项),以便在下一次编译中,/keyname 选项可以生效。

/keyn[ame]:text

指定保存密钥对的容器。 这样将会通过将公钥插入程序集清单来对程序集签名(为它指定一个强名称)。 然后 Al.exe 使用私钥对最终程序集签名。

使用 Sn.exe 生成密钥对。

密钥信息在程序集的 .publickey 字段中显示。

如果有嵌入的空格,请用双引号 (" ") 将 text 引起来。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyKeyNameAttribute)。

/main:method

指定方法的完全限定名称 (class.method),以用作将模块转换为可执行文件时的入口点。

/nologo

调用 Al.exe 时,在命令行取消显示版权标志或徽标。

/out:filename

指定 Al.exe 生成的文件的名称。 这是必需的选项。

/platform:text

限制可以运行该代码的平台;必须为 x86、Itanium、x64 或 anycpu(默认值)之一。

/prod[uct]:text

为程序集中的 Product 字段指定字符串。 如果 text 包含空格,则将字符串放置在双引号 (" ") 中。 此字符串是程序集上的自定义特性,可以使用反射进行查看。

如果不指定 /win32res/product 将在 Windows 资源管理器中显示为 Win32 Product Name 资源。

如果文本是空字符串,Win32 Product Name 资源就会显示为一个空格。

如果指定 /win32res/product 将不会影响 Win32 资源信息。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyProductAttribute)。

/productv[ersion]:text

为程序集中的 Product Version 字段指定字符串。 如果 text 包含空格,则将字符串放置在双引号 (" ") 中。 此字符串是程序集上的自定义特性,可以使用反射进行查看。

如果不指定 /win32res/productversion 将作为 Win32 Product Version 资源使用。 如果不指定 /productversion,Win32 Product Version 资源就会被 Win32 File Version 资源填充。

如果指定 /win32res/productversion 将不会影响 Win32 资源信息。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyInformationalVersionAttribute)。

/t[arget]:lib[rary] | exe | win[exe]

指定输出文件的文件格式:lib[rary](代码库)、exe(控制台应用程序)或 win[exe](基于 Windows 的应用程序)。 默认值为 lib[rary]。

/template:filename

指定程序集 filename,除区域性字段之外的所有程序集元数据都从该程序集继承。

使用 /template 创建的程序集将是附属程序集。

/title:text

为程序集中的 Title 字段指定字符串。 如果 text 包含空格,则将字符串放置在双引号 (" ") 中。 此字符串是程序集上的自定义特性,可以使用反射进行查看。

如果不指定 /win32res/title 就会在 Windows 资源管理器中显示为 Win32 Description 资源,shell 将其用作应用程序的友好名称。 如果某个文件类型有多个支持应用程序,则该字符串也会出现在此文件类型的快捷菜单的“打开方式”子菜单中。

如果文本是空字符串,Win32 Description 资源就会显示为一个空格。

如果指定 /win32res/title 将不会影响 Win32 资源信息。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyTitleAttribute)。

/trade[mark]:text

为程序集中的 Trademark 字段指定字符串。 如果 text 包含空格,则将字符串放置在双引号 (" ") 中。 此字符串是程序集上的自定义特性,可以使用反射进行查看。

如果不指定 /win32res/trademark 在 Windows 资源管理器中就会显示为 Win32 Trademark 资源。

如果文本是空字符串,Win32 Trademark 资源就会显示为一个空格。

如果指定 /win32res/trademark 将不会影响 Win32 资源信息。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyTrademarkAttribute)。

/v[ersion]:version

指定此程序集的版本信息。 版本字符串的格式为 major.minor.build.revision。 默认值为 0。

如果指定 /version,则必须指定 major。 如果指定 major 和 minor,则可以指定一个星号 (*) 作为 build。 这会使 build 等于从当地时间 2000 年 1 月 1 日算起的天数,使 revision 等于从当地时间当日午夜算起的秒数的一半。

如果指定 major、minor 和 build,则可以指定一个星号作为 revision。 这会使 revision 等于从当地时间当地午夜算起的秒数的一半。

概括而言,有效的版本字符串如下:

X

X.X

X.X.*

X.X.X

X.X.X.*

X.X.X.X

其中 X 是 0 至 65534 之间(不含 65535)的任何一个无符号短常数。

如果不指定 /win32res/version 将作为 Win32 Assembly Version 资源使用。

如果不指定 /win32res/productversion/fileversion/version 将用于 Assembly Version、File Version 和 Product Version Win32 资源。

如果指定 /win32res/version 将不会影响 Win32 资源信息。

还可以将此选项指定为任何 MSIL 模块的源代码中的自定义特性 (AssemblyVersionAttribute)。

/win32icon:filename

在程序集中插入 .ico 文件。 .ico 文件在 Windows 资源管理器中赋予输出文件所需的外观。

/win32res:filename

在输出文件中插入 Win32 资源(.res 文件)。 Win32 资源文件可以用资源编译器创建。 在编译 Visual C++ 程序时会调用资源编译器;.res 文件是用 .rc 文件创建的。

@filename

指定包含 Al.exe 命令的响应文件。

响应文件中的命令既可以每行显示一个,也可以显示在同一行中,用一个或多个空格分隔。

/?

显示该工具的命令语法和选项。

备注

所有 Visual Studio 编译器都产生程序集。 但是,如果您有一个或多个模块(没有清单的元数据),则可使用 Al.exe 在单独的文件中创建带清单的程序集。

要在缓存中安装程序集,从缓存中删除程序集,或列出缓存内容,请使用全局程序集缓存工具 (Gacutil.exe)

示例

以下命令使用 t2.netmodule 模块中的程序集创建可执行文件 t2a.exe。 入口点是 MyClass 中的 Main 方法。

al t2.netmodule /target:exe /out:t2a.exe /main:MyClass.Main

请参见

任务

如何:从命令行使用 MSTest 运行自动测试

参考

Al.exe 工具错误和警告

Sn.exe(强名称工具)

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

Visual Studio 和 Windows SDK 命令提示

其他资源

.NET Framework 工具

使用程序集编程

修订记录

Date

修订记录

原因

2011 年 4 月

添加了有关使用 Visual Studio 和 Windows SDK 命令提示符的信息。

信息补充。