今日将一个大的asp.net解决方案从VS2005升级为VS2008,本来以为由VS自动转换后就应该不会有问题。没想到出现了不少问题,弄了大半天。
其中的一个主要原因就是项目生成时的“输出路径”问题。
一般说来,asp.net项目的类库项目的“输出路径”会有两种方式,一种就在自身项目的bin目录下,另一种则是将动态链接库生成放到web应用程序或者网站的bin目录下。
第一种方式,比较方便,也是默认选项,其它项目引用时也是直接引用bin目录下的动态链接库。但是如果项目过多时,可能导致虽然只修改一个小地方,就要重新编译很多个项目的情况,编译速度慢。
第二种方式,需要手动在项目属性里设置,一般都是用相对路径,如“../web/bin”类似的。这种项目引用时是引用web项目里的动态链接库,编译时不会连带编译,速度较快,比较适合较大型的项目。
这两种方式应该是要结合使用的,一般来说使用工厂模式的项目和比较跟程序独立的项目可以考滤用第二种方式。建议可以看看Discuz!NT的项目属性,它有几个项目就是采用第二种方式的。
而我前面说的那个解决方案06年时曾经将第一种方式改为第二种,所以其各自项目的bin目录下都还有06年时生成的dll存在。解决方案转化成2008的后,单独编译项目是没有问题的,但如果编译有引用另一项目的项目时,会把被引用项目的bin目录下的dll(就是前面说的06年残留下来的dll)复制到网站目录下,导致06年以后编写的程序都没有进入到dll里,产生错误。刚开始还没有发现这个问题,以为代码有错,但看程序却又是没有问题的,后面不小心发现,bin目录下的几个dll的生成日期是06年,才恍然大悟。
后面没有办法,只好将若干个项目的输出路径改回了第一种方式,并更新了其它项目的引用,因为解决方案比较大,又在源代码管理下,弄了大半天工夫。