按照CLR via C#中的说法,"如果强名称程序集的文件是从GAC之外的一个位置加载的,CLR会在程序集加载时比较哈希值.换言之,应用程序每次执行并加载程序集时,都会对文件执行一次哈希处理,以牺牲一定性能为代价,保证程序集文件的内容没有被篡改.CLR在运行时检测到不匹配的哈希值,会抛出一个System.IO.FileLoadException异常."
然而我进行了实验,修改了一个强命名的程序集,运行时并未抛出异常.实验方法如下:
程序集代码:
class Program
{
public static void Main()
{
System.Console.WriteLine("xxxxxxxxxxxxxxxxxxx");
}
}
生成密钥:
sn -k myKey.snk
编译强命名程序集:
csc /keyfile:mykey.snk main.cs
修改程序集:
用16进制编辑器打开main.exe,找到字符串"xxxxxxxxxxxxxxxxxxx"(78 00 78 00...),修改成"yxxxxxxxxxxxxxxxxxx"(79 00 78 00...),保存.
运行main.exe,正常输出yxxxxxxxxxxxxxxxxxx,并未抛出System.IO.FileLoadException异常,为什么?
按照MSDN的说法,.net 3以后,对于Full Trust的程序集是不进行强名检查的
你的这个例子由于不是部署在GAC中的,认为是Full Trust的,所以符合这个条件,没有进行检查
如果强制它验证,参考http://msdn.microsoft.com/en-us/library/cc679069.aspx加上配置项再运行就出错了,此时进行了强名检查
这样也是有一定的方便性,如果程序集放在自己的目录,一般情况下肯定是信任的
安全性的保证: 如果这样的修改的程序集如果要放到gac中,是放不了的,因为sn -v main.exe会检测到修改的问题