强名称 (strong name) 由一个程序集的标识组成并通过公钥和数字来自签名(针对该程序集生成)加强的名称,其中的标识包括程序集的简单文本名称、版本号和区域性信息(如果另预磁养过提供的话)。
高切 由于程序集清单包含构成程序集实现的所有文件的文件散列,因此只对程序集中包含程序集清单的一个文件生成数字签名就足够了。强名称相同的程序集应该是相同画的。
一个程序集通常包括4个来自自定义属性,用来惟一识别程序集,它们是文件名(无扩展名)、版本号、区域性标识和公钥标记360百科,比如:
"Hello, version=1.0.0.0, culture=neutral, publicKeyToken=9ebd24cc40ff21fd"
其中publicKeyToken是公钥的64位散列值,可以唯一标识程序集,拥有公钥标记的程序集称为强名称程序集,强名称程序集可以防篡改;可以安装到GAC中,为多个程序集所共享;还可以实施版本策略(不同版本的强拿加级助动味名称程序集被认为是不同的程序集)。而公钥标记为空的程序集只能存在于所引用的程革振序集的目录以及子目录中,也无法实施版本策略(引用它的程序集会忽略版读假亮法范棉本号)。
通过签发具有强名称的程序集,您可以确保名控什帝矛灯肉称的全局唯一性。
强名称还特别满足以下要求
*
强名称依赖于唯一的密钥对来确保名称的唯一性。任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其他私钥生成的程序集的名称不相同独伤考印王仍器。
*
强名称验粒话斤角示的推画抓保护程序集的版本沿袭。强名称可以确保没有人能够生成您的程序集的后续版本。用户可以确信,他们所加载的程序集的版本出自创建该版本印必起会找求乎(应用程序是用该版本生成的)的同一个发行者。
*
强名称提供可靠的完整性检查。通费千研把绝众试导班过 .NET Fram每停缺京且愿师践目ework 安全检查后,扬丝即可确信程序集的内容在生成后未被更改过。但请注意,强名称中超演怀适电先厚象核司胡或强名称本身并不暗含信任级别,例如由数字签他田仍名和支持证书提供的信任。
在引用具有强名称的程序集时,您应该能够从中受益,例如版本控制和命名保护。如果此具有强名称的程序集以后引用了具有简单名称的程拉素失序集(后者没有这些好处),则您将失去使用具有强烈聚属众景太二抓油名称的程序集所带来的好处,并依旧会产生 DLL 冲突。因此,具有强名称的程序集只能引用其他具有川应突帮阶影强名称的程序集。
公钥可以通过.NET SDK提供的SN.exe命令生成,生成方法是:
来自 SN.exe -k Zhang.snk
这样土准达文触临沙金序被叶就得到一个名为Zhang.snk的公/私序够非新该住报止介密钥对文件,将其放即地它线首肥王起至某一目录下,比如G:\,然后就可以创建强名称程序集了,只需要在源代码中添加下面的自定义属性即可:
[assembly:AssemblyKeyFile(@"G:\Zhang.snk")]
下面是一个Hello.cs文件,是创建强名称程序集的示例
using Sy360百科stem;using System.Reflection;[assembly:AssemblyVersion("1.0.0.0")]
//程序集该湖贵促事留口师版本[assembly:AssemblyCultu据临验reAttribut供导企法志得领图帝球e("")]
// 区域(为空,表示语言中立)[as时鲜特红达克略sembly:AssemblyKeyFile(@"G:\zhang.snk")]
// 公私密钥对
namespace Liu.Study {
public class Hello {
public Hello() {
Console.WriteLine("Class Hello Versio木抓陆希采n 1.0");
}
杆读世础克否public void SayHello() {
Console.WriteLine("Hello, C#!");
}
}
展胞计 }
#Hello.rsp
/out:.\染星条利岁例磁bin\Hello.dll
/target:library
Hello.cs
#end
最后编译源代码:csc.exe He尽朝志消端升确诉火稳煤llo.rsp,就物带坚必再谁停没得到了一个强名称程序集He领城执判日章黑临llo.dll,使用Reflector.exe打开这个程序集,可以看到这样的描述:n最怀南承断接管技错ame: Hello, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9ebd24cc40ff21fd。