在许多时候,我们的项目中需要引用到别的项目生成的程序集,但是如果人工去复制粘贴这些项目生成的程序集,项目少还可以应付。如果有许多项目引用某个程序集,人工复制粘贴不仅效率不高,而且很容易出错。而且,被引用的程序集很可能会被修改然后重新编译,这就意味着我们又需要重新拷贝一次新生成的程序集,听完后心情感觉好沉重啊
对此有人可能会提出解决办法:可以让引用某程序集(为了描述方便我们称之为A)的所有项目把对A的引用地址都指定为A的当前路径,不就不需要每次都去人工复制粘贴了。
似乎上面的办法解决了项目重新生成后频繁复制的问题,但是,真的就没有问题了吗?
如果某一天,被引用程序集A的项目被挪地方了呢?
天啦,简直就是噩梦,那就意味着我们需要修改每个引用A的项目的引用地址。如果项目很多...
那么,如何终极地解决这个问题呢?
一般都会建一个引用程序集的特有目录,我们可以将其命名为lib;然后将所有待引用程序集的最新版本都拷贝到该目录中,这样其他项目引用的就不是某个具体的项目生成目录,以后即使生成引用程序集的项目的位置发生变化,也不会影响别的项目的程序集引用。
但是,如果某个项目重新生成了,可是我们忘了把最新的程序集拷贝到lib中,这样我们引用到的还是旧的引用程序集。如何避免这样的情况呢?
这就需要用到VS项目属性中的生成事件了。
这里我们着重讲“后期生成事件”,在解决我们的问题时,“后期生成事件”要做些什么呢?
那就是每次项目重新生成时,把最新的程序集拷贝到指定的位置(如lib文件夹)。
“后期生成事件” —— 顾名思义,就是项目生成时发生的事件。把拷贝工作放到其中再合适不过。
下面就介绍具体如何去做:
- 首先,进入到某个项目的属性中,找到其中的“生成事件”标签页,见图1的①处;
在“生成事件”标签页中,可以定义“后期生成事件”,见图1的②处;
图1 项目属性-- 生成事件
- 在后期生成事件中输入拷贝语句
下面是代码:
Copy /y "$(TargetDir)$(TargetName).dll" "../../../../Lib"
关于这段简单的代码,有几点需要说明的:
1) copy命令不是VS独有的,这里的copy命令就是命令行中的copy命令;
copy的具体参数的意义大家没有必要刻意去记,在命令行中输入copy /?就有。
这里/y的意思是:如果目标目录中有与source文件同名的文件不提示是否要覆盖。
2) copy的最后一个参数是目标路径和文件名;前面的参数是待复制的文件名(含完整路径),
可以指定多个待复制的文件
3) $不是字符串连接符。 而是VS的生成事件中宏的引用前缀。
并且,$(TargetDir)这样的宏引用路径中在结尾是包含"\"的。