关于“Assemblies Should Have Valid Strong Names 程序集应该拥有一个有效的强名称”的分析与解决
之前帮同学开发了一个游戏的小外挂,运行成功以后带着小小的虚荣心用FXCOP分析了一下,遇到了这么样一个提示:
CriticalError, Certainty 95, for AssembliesShouldHaveValidStrongNames
当时百度了一下,在MSDN大致了解了是怎么回事,但没有找到解决办法,各方解释的材料基本同源,比较晦涩。因为问题不大,当时就懒得去管了。今天翻看枕边书《.NET框架程序设计(修订版)》(Jeffrey Richter,李建忠译)的时候忽然想起那个问题,书上讲得很清楚。
一般项目发布成exe或者dll文件,不同的公司和个人很容易发布出相同名称的程序集来,形成DLL hell问题。.NET为了避免该问题引入了强命名程序集。要求包括:文件名、版本号、语言文化标识和公有密钥标记。前三者从项目自带的AssembliyInfo里面寻找。最后一个公有密钥标记则要自己弄。方法是:
1、命令行CMD,进入C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin,找到SN.EXE文件
注意,各人的路径可能不一样,建议本机搜索下,我在网上找的地点都不尽相同
2、输入 SN -K ClarkApp.keys 产生自己公司或个人的钥文件(该文件包含公钥和私钥)。ClarkApp可以自己设置
3、把产生的公钥文件ClarkApp.keys拷贝到项目中
4、在命名空间上加入
namespace test
{
public class Class1
{
//
}
}
再编译文件,再FXCOP分析,发现原来的代码检查结果少了一行,质量又上了一层^_^
注:公钥文件可以直接用UE查看,另外可以用以下方式查看
第一步:分离出公钥到一个新文件。输入sn -p ClarkApp.Keys Clarkapp.publickey
第二步:查看。sn -tp ClarkApp.PublicKey
另外,因为是给程序集做标记,同一个项目即使有多个命名空间只要有一个上面注明了AssemblyKeyFile就可以了