强名称是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的。Microsoft® Visual Studio® .NET 和在 .NET Framework SDK 中提供的其他开发工具能够将强名称分配给一个程序集。强名称相同的程序集应该是相同的。
通过签发具有强名称的程序集,您可以确保名称的全局唯一性。强名称还特别满足以下要求:
-
强名称依赖于唯一的密钥对来确保名称的唯一性。任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其他私钥生成的程序集的名称不相同。
-
强名称保护程序集的版本沿袭。强名称可以确保没有人能够生成您的程序集的后续版本。用户可以确信,他们所加载的程序集的版本出自创建该版本(应用程序是用该版本生成的)的同一个发行者。
-
强名称提供可靠的完整性检查。通过 .NET Framework 安全检查后,即可确信程序集的内容在生成后未被更改过。但请注意,强名称中或强名称本身并不暗含信任级别,例如由数字签名和支持证书提供的信任。
在引用具有强名称的程序集时,您应该能够从中受益,例如版本控制和命名保护。如果此具有强名称的程序集以后引用了具有简单名称的程序集(后者没有这些好处),则您将失去使用具有强名称的程序集所带来的好处,并依旧会产生 DLL 冲突。因此,具有强名称的程序集只能引用其他具有强名称的程序集。
使用强名称为程序集签名的方法有两种:
-
使用 .NET Framework SDK 提供的 。
-
使用程序集属性将强名称信息插入代码中。您可以使用 或 ,这取决于要使用的密钥文件所在的位置。
要使用强名称为程序集签名,必须具有加密密钥对。有关创建密钥对的更多信息,请参见如何:创建公钥/私钥对。
使用“程序集链接器”创建程序集并为其签署强名称
-
在命令提示处,键入下列命令:
al /out:<assembly name> <module name> /keyfile:<file name>
在此命令中,assembly name 是要使用强名称签名的程序集的名称,module name 是用于创建程序集的代码模块的名称,file name 是包含密钥对的容器或文件的名称。
下面的示例使用密钥文件 sgKey.snk
为程序集 MyAssembly.dll
签署强名称。
复制代码 | |
---|---|
al /out:MyAssembly.dll MyModule.netmodule /keyfile:sgKey.snk |
使用属性为程序集签署强名称
-
在代码模块中,添加 AssemblyKeyFileAttribute 或 AssemblyKeyNameAttribute,指定在使用强名称为程序集签名时要用到的密钥对所在的文件或容器的名称。
下面的代码示例使用具有名为 sgKey.snk
的密钥文件(位于编译程序集的目录中)的 AssemblyKeyFileAttribute。这假设该程序集是使用命令行编译器 vbc.exe 和 csc.exe 编译的。
Visual Basic | 复制代码 |
---|---|
<Assembly:AssemblyKeyFileAttribute("sgKey.snk")> |
C# | 复制代码 |
---|---|
[assembly:AssemblyKeyFileAttribute(@"sgKey.snk")] |
注意 |
---|
在诸如 Visual Studio 这样的开发环境中,程序集可能不是在项目目录中编译的。例如,有些版本的 Visual Studio 在 |