在vs.net2003的安装项目的文件系统中,可以通过添加特殊文件夹的功能,添加预定义的“Global Assembly Cache Folder”,把解决方案中需要放入到gac的类库项目输出到这个目录,然后安装,dll就会被安装进gac。可是,又发现新问题:
解决方案中的主项目修改后,重新生成安装文件(要放入gac的类库项目未有修改),重新安装,问题出现,安装完后,在gac中的dll不见了.
改了安装项目的version后编译再次安装,gac中的dll再次安装上.这时我考虑是不是va.net生成的msi在把dll安装进gac中时会查看这个dll是否已经存在,如果存在,会执行删除这个dll的操作.为了印证这个想法,在类库项目中修改了这个version和calture(主项目不修改),同时修改安装项目的version号,重新编译,安装.完后发现gac中的原来的那个dll被新版本的dll替换.这里有两个问题了:
1、其实一般在安装项目中带有的要安装进gac的dll,同时在目标机器上的gac已经有这个dll时,希望这个dll不再安装,或者再次安装一次也无所谓,删掉这个dll将不是希望的操作,这会导致系统无法运行了。
2、从上面的实践可以看出,好象msi把一个dll放入gac的时候会替换掉assembly名一致的dll,而不管version和caltrue是否不同。实际上一个dll的标识是由assembly name,version,caltrue、key token共同决定的,其中任何一个不同就表示是不同的dll。哪位高人可以指点一二?
解决方案中的主项目修改后,重新生成安装文件(要放入gac的类库项目未有修改),重新安装,问题出现,安装完后,在gac中的dll不见了.
改了安装项目的version后编译再次安装,gac中的dll再次安装上.这时我考虑是不是va.net生成的msi在把dll安装进gac中时会查看这个dll是否已经存在,如果存在,会执行删除这个dll的操作.为了印证这个想法,在类库项目中修改了这个version和calture(主项目不修改),同时修改安装项目的version号,重新编译,安装.完后发现gac中的原来的那个dll被新版本的dll替换.这里有两个问题了:
1、其实一般在安装项目中带有的要安装进gac的dll,同时在目标机器上的gac已经有这个dll时,希望这个dll不再安装,或者再次安装一次也无所谓,删掉这个dll将不是希望的操作,这会导致系统无法运行了。
2、从上面的实践可以看出,好象msi把一个dll放入gac的时候会替换掉assembly名一致的dll,而不管version和caltrue是否不同。实际上一个dll的标识是由assembly name,version,caltrue、key token共同决定的,其中任何一个不同就表示是不同的dll。哪位高人可以指点一二?
但是你要第二次安装的时候,必然要先卸载,dll从cache中释放出来”就是这个有问题,我不需要它卸掉啊,而且一般的需求也不需要系统把这个dll卸掉,需要的是不动作或者覆盖也行。“然后你再安装,又有了
(如果dll已经存在,新的安装文件会再次添加进去,覆盖掉原来的)”新的dll,version和caltrue都不同了,应该可以跟原来的dll并存在gac的,它为什么会安装了新版本的dll,同时要卸掉原来那个不同版本的dll?