新建solution,然后添加一个ClassLibrary的项目test,然后在这个项目中加public属性的class2,class3,里面不加任何代码.加usercontrol1, 随便拉几个button上去,保存,编译,然后在项目属性里,给这个项目加上强名称,密钥文件为test.pfx(pfx与snk文件一样,都可以用来给程序集加上强名称,但是pfx是在加的过程中,需要设置密码的).使用gacutil把程序集加入GAC中.

步骤一:  新建一个windowsApplication1项目,引用刚刚生成的dll,可以正常使用usercontrol1. 然后再向test项目中加入usercontrol2,重新编译后,在windowsapplication中,toolbox中出现了新增加的usercontrol2,但是如果把它拉出,来添加到winform项目的form中时,报错.但是如果从GAC中,将test.dll移走,重新编译,则能够正常使用usercontrol2,或者将test的assembly的version改掉,重新编译,也可以正常使用usercontrol2. 看样子是因为test的程序集被注册成共享程序集后 ,这个程序集就无法被修改了(但是usercontrol2这个类型还是能够出现在test的名字空间,难道可以修改它的manifest?)改掉version号后的test程序集已经跟GAC中的test不是同一个程序集,所以能被编译进去.再以此推断,如果给test换个密钥,也能把修改后的内容编译进去.问题:为什么test程序集注册成共享程序集后,不能再在项目里把新修改的内容编译进去呢???


步骤二: 把version号改回来,使test的程序集和GAC的test一样. 然后给class2加上如下代码:
public static int x = 0;重新编译,发现在winform项目中可以正常访问这个x变量,这就怪了,怎么能够编译进去呢?难道public static int x = 0;编译后也是存在与manifest中的吗??

步骤三: 给class2中加入如下代码:
public static int add(int z)
{
   return x +z;
}
重新编译,winform项目中,可以访问add方法,int a = test.Class2.add(3); 这样编译不报错,但是debug的时候会抛出异常,无法访问add方法. 这到是好理解,毕竟前面得出过结论,在gac中的程序集是不能被修改的,但是为什么呢???

步骤四: 从gac中移走test,然后保持test的强名称不变,重新编译,winform项目中,可以正常使用add方法,不会报错.那为什么说强名称能保证程序不篡改呢?这样不就改动了吗?(这个问题好象问的有点弱智,我也不知道).


另外还有如下疑问:使用snk密钥文件和使用pfx密钥文件,到底有什么区别呢??各位高手们,给点指点吧.
posted on 2007-04-07 16:39  紫mm  阅读(679)  评论(0编辑  收藏  举报