实事证明我这个方法还不是最好的...还有更好的..我下面再接着写....兄弟们跟帖我就早点写哈...
在上一篇文章 <<.net 网站项目dll引用,项目引用的管理问题>>http://blog.csdn.net/phker/article/details/5792552
中谈到多个项目引用出现的dll泛滥问题...
上一篇中谈到项目对外部代码的引用可以通过常见的两种方式引用,
- 一种是把其它项目生成的dll文件复制到项目中然后添加引用.
- 一种是直接引用项目源代码
两种各有优缺点..
dll引用的优点:,
- 源代码安全可以管理
- 程序的独立性更好一点
- 可单独发布dll文件
- 顶层项目重新生成的时候只需要编译一个项目. 不会出现一点"重新生成" 全部项目都编译一边的情况
dll引用的缺点:
- 看代码的时候F12转到定义就不太好用了
项目引用的优点:
-
F12转到定义,能够直接跳到源代码上.
-
项目引用的缺点:
- 代码不安全,新手程序员要用必须全部都源代码都给..
- 顶层项目一生成所有引用的项目都要生成一边..
对于我这种有点要求苛刻的程序员来讲..机器的速度慢是个难以容忍的事情..项目多了生成起来更是受不了..
所以我倾向于dll引用.因为我的项目比较多.17个左右的项目量.虽然每个都不大.. 每次都批量生产,岂不是要命..
何况我这种需要成就感激励的人, 每改一点都要生成一次看看效果的....
好废话到此..下面看看怎么来处理这个多项目引用dll的问题..
话说我是做B/S架构的软件比较多.所以我的软件顶层都是web项目..
这里还要扯个话外题..
关于web层到底是选择web应用程序类型的项目好?还是web网站好..
我做了好几年的开发实际上都是用的web网站,已经习惯了...
最近听说web应用程序好..所以就赶时髦.改成web网站了.刚开始还有点不习惯..
后来更不习惯了...简直就是废物...
web应用程序的好处..
- 只能体现在发布的时候能发布成一个dll文件..项目输出可以由项目控制...
web应用程序的缺点
每改一点后台代码整个网站都需要编译一边---------------实在受不了.
如果是一个人开发还凑合着用用..但是....如果是一个团队在开发...
A兄弟出错了,签入了..或着忘记了.或者怎么了.导致这个网站都编译不通过...
全组的兄弟就只能等着了....久而久之导致整个团队精神紧张,生怕自己弄错了导致大家矛头相向...
更全面的比较可以查看官方的说法.. http://msdn.microsoft.com/zh-cn/library/dd547590.aspx#summary_of_differences
这样看来为了效率起见还是习惯采用web网站了..
其实鱼和熊掌也可兼得的...(下文仅供参考,误要拍砖,俺是小团队高不起单元测试啥的...)
很简单开发的时候你用web网站开发.然后发布的时候转换成web应用程序再发布...如果你要做单元测试....其实web网站也能做单元测试的...自己随便想个法子就能做单元测试...
至于怎么转换成web应用程序请参照官方的文章.http://msdn.microsoft.com/zh-cn/library/aa983476.aspx
好..下面转回正题.
一个web网站如何引用dll在上一篇文章中提到过...但是那种方法还是有很多的问题..
后来经过不断的改进..终于弄出来了一套近乎完美的方法..
下面是解决方案文件组织图.
--MYSLN
|
|--A项目
|--B项目
|--C项目
|--D项目
|--E项目
|--F项目
|--G项目
|--Web项目
其中G项目需要引用F项目依次为表示为 Web->G->F->E->D->C->B->A
如果是项目引用,结果是所有的项目都需要生成一边.
我的生成方案是这样的,把所有的项目生成都放到一个目录…然后引用的时候也全部都从这个目录下面去引用..
这样不会出现项目生成的时候被老的dll覆盖的问题..
所有项目的输出都是一个地方,引用也是同一个地方..这样都是最新的,绝对不会出现老dll覆盖问题.
以前我是把所有的项目生成都放到一个目录Z:/bin目录下,,后来细想为何不把这个目录直接订到web项目下的bin文件夹呢..反正项目可以写相对路径..
于是我把生成的目录改成输出到..\web\bin下…
而且到任何一个机器都可以很方便的开始开发不需要再配置符号链接啥的了..简洁就是美嘛…呵呵..
但是dll引用又会出现一个新问题.批量编译的问题…
当我选择多个项目一次性全部重新生成的时候就会出现无法复制到 E:\****\web\bin\***.dll目录拒绝访问…这个错误..
刚开始我还以为是项目代码受vss管理的目的dll属性变为只读的缘故..后来才发现实际上还有一个问题…
当你一次选择多个项目批量生成的时候会出现多个线程进行编译.一个项目一个线程..这样就会出现多个线程争夺同一个dll的情况…(因为有引用关系在嘛)
所以又搞了好久….最后.终极方案出炉了…
只需三步:
首先把所有的项目生成全部指向到 ..\web项目名称\bin
然后把生成事件加点dos命令进去
del /F $(TargetName)$(TargetExt)
del /F $(TargetName).pdb
del /F $(TargetName).xml
在把所有项目的引用全部指向..\web\bin中的某个dll
第四步解决 bin目录只读和vss源代码管理问题..
弄了个监视程序...把这个程序放到bin目录下..程序自动把当前目录的所有文件全部去掉只读属性,并且加上隐藏属性(Vss就不管理了)不影响程序运行
只要文件有改动就修改文件的只读和隐藏属性..
文件下载地址...
http://download.csdn.net/detail/phker/4331483
刚发表完就有这么多人..访问...上首页的感觉真好...