在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。哪位高人可以指点一二?

解决方案 »

  1.   

    如果version不同,它当然会添加到assembly cache中,这样就会产生二个甚至更多相同名字的assembly我也做过,但是如果你把assemblyinfo这个文件的version由1.0.*改成1.0.0.0或者其他,就不会出现这种问题了(当然这个文件是你要加载到cache中的项目的assemblyinfo.cs文件哦,而不是你的主项目)
      

  2.   

    另外,.Net2003做安装的时候,请问能否使用CustomAction,如果可以的话,你也可以写另外一个exe来执行添加到cache中这件事情,当然version要fixed,要不每次都产生一个新的版本,.Net2005就是固定version(default)
      

  3.   

    to uumlwy(爱老婆)你好象没有看清楚我的描述,拜托你在仔细看看
      

  4.   

    你安装了一次,dll进入cache但是你要第二次安装的时候,必然要先卸载,dll从cache中释放出来然后你再安装,又有了(如果dll已经存在,新的安装文件会再次添加进去,覆盖掉原来的)
      

  5.   

    “你安装了一次,dll进入cache
    但是你要第二次安装的时候,必然要先卸载,dll从cache中释放出来”就是这个有问题,我不需要它卸掉啊,而且一般的需求也不需要系统把这个dll卸掉,需要的是不动作或者覆盖也行。“然后你再安装,又有了
    (如果dll已经存在,新的安装文件会再次添加进去,覆盖掉原来的)”新的dll,version和caltrue都不同了,应该可以跟原来的dll并存在gac的,它为什么会安装了新版本的dll,同时要卸掉原来那个不同版本的dll?
      

  6.   

    uumlwy(爱老婆) 有没有QQ或者msn之类的即时通讯?
      

  7.   

    特别是第一点,设想刚做好的程序拿到用户那安装运行,用户使用过程中发现问题反馈过来,我这修改程序(放入gac的dll没有改动,也就没必要该此dll的版本号),然后那新版本的msi到客户那安装,装好后结果gac中的dll没了。必须再重新安装一次,或者第二次时就把原来的类库项目改个版本才行。
      

  8.   

    大概与文件有关,虽然你修改了版本等属性,但安装时还是安装到GAC指定的目录中去,在文件系统中只有文件名是标识,所以虽然版本等信息不一样,他还是会替换以前的文件.如果想安装两个版本的程序集,楼主可以考虑安装在不同的目录下比如:V1/a.dll V2/a.dll