一个程序集通常包括4个自定义属性,用来惟一识别程序集,它们是文件名(无扩展名)、版本号、区域性标识和公钥标记,比如:
"Hello, version=1.0.0.0, culture=neutral, publicKeyToken=9ebd24cc40ff21fd"
其中publicKeyToken是公钥的64位散列值,可以唯一标识程序集,拥有公钥标记的程序集称为强名称程序集,强名称程序集可以防篡改;可以安装到GAC中,为多个程序集所共享;还可以实施版本策略(不同版本的强名称程序集被认为是不同的程序集)。而公钥标记为空的程序集只能存在于所引用的程序集的目录以及子目录中,也无法实施版本策略(引用它的程序集会忽略版本号)。
公钥可以通过.NET SDK提供的SN.exe命令生成,生成方法是:
SN.exe -k Zhang.snk
这样就得到一个名为Zhang.snk的公/私密钥对文件,将其放至某一目录下,比如G:/,然后就可以创建强名称程序集了,只需要在源代码中添加下面的自定义属性即可:
[assembly:AssemblyKeyFile(@"G:/Zhang.snk")]
下面是一个Hello.cs文件,是创建强名称程序集的示例
using System; using System.Reflection; [assembly:AssemblyVersion("1.0.0.0")] //程序集版本 [assembly:AssemblyCultureAttribute("")] // 区域(为空,表示语言中立) [assembly:AssemblyKeyFile(@"G:/zhang.snk")] // 公私密钥对 namespace Zhang.Study { public class Hello { public Hello() { Console.WriteLine("Class Hello Version 1.0"); } public void SayHello() { Console.WriteLine("Hello, C#!"); } } }
#Hello.rsp
/out:./bin/Hello.dll
/target:library
Hello.cs
#end
最后编译源代码:csc.exe Hello.rsp,就得到了一个强名称程序集Hello.dll,使用Reflector.exe打开这个程序集,可以看到这样的描述:name: Hello, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9ebd24cc40ff21fd。
参考书籍:
《Microsoft .NET Framework 程序设计》 Jeffery Richter著 商丽媛译 清华大学出版社
《.NET本质论》 Don Box,Chris Sells 著 张晓坤译 中国电力出版社
《MSDN》