CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

      当项目比较庞大时候Dll文件的管理显得就尤其重要了,比如多个解决方案有不同项目之间的引用,如果引用的路径都指向某项目bin下的dll文件的话,dll维护起来很不方面,因此遇到这种情况的话该怎么更好的管理这些DLL文件呢?最近进行中移动项目就属于这种情况,项目中有三个解决方案,每个解决方案下有多个项目,并且每个解决方案的不同项目又有引用。而且又引用了外部的一些Com组件,当一个项目代码发生变化时候,其他项目引用该dll文件是否已经更新是经常需要考虑的问题,而且这样当出现bug时候也很难确定是否是DLL版本更新问题。另外不但这样的DLL文件管理很麻烦,而且很可能导致dll文件版本不正确引起莫名奇妙的问题。

     目前这个项目进行到了最后阶段,对这个项目进行了重构,所以对项目的DLL文件的管理进行了整理,整理过程中有一些新的体会和朋友们分享。而且也学习了关于Post-build event command line事件即(生成后事件)的用法,感觉用Post-build event command line不失为管理DLL一种方法。个人感觉这种方法比较实用,先分享出来供朋友们参考,希望朋友们能提出宝贵的意见。

总述当多个解决方案互相有引用DLL关系时,可以统一建立一个ReferenceLib文件夹,所有项目引用外来的DLL(非本解决方案)都引用该ReferenceLib文件夹下的,里面存放所有已经编译好的其他解决方案的DLL,一旦引用外部的DLL,那么在项目中引用的地方将显示路径,而在同一个解决方案下的不同项目将直接引用项目即可。

现在的问题就是当项目下有更新时候,如果把更新的dll文件从项目下拷贝到专门用于dll文件管理的ReferenceLib文件夹下呢?也就是说当项目编译的时候就执行拷贝操作,这样就用到了上面说到的Post-build event command line编译生成后事件。

在编译某工程时将DLL拷贝到指定的文件夹下,便于及时引用新的DLL。在Build Events----->post build event command line中写命令

语法是:copy "路径1" "路径2"

注:路径1代表要从哪儿拷贝的路径,即相当于"From"

路径2代表文件拷贝到哪儿去,即相当于"To"

下面是一些例子用法理解这种语法格式

     copy "$(SolutionDir)configuration\*.xml" "C:\CharlesChen" 

    copy "$(SolutionDir)configuration\*.configuration" "C:\CharlesChen"

    copy "$(SolutionDir)configuration\*.config" "C:\CharlesChen"

    copy "$(SolutionDir)configuration\Icon\*.config" "C:\CharlesChen" 
    copy "$(SolutionDir).."reference\database.config" "C:\CharlesChen"

    copy "$(SolutionDir).."reference\Images\open.gif" "C:\CharlesChen"

注意:

    1.$(SolutionDir) 表示该解决方案,  "$(SolutionDir)configuration " 该解决方案下有文件configuration.

    2."*.xml" 表该文件下后缀为"xml"的文件.

3."$(SolutionDir)..\reference\" 表示和该解决方案同级有文件 reference.

Copy "$(ProjectDir)bin\Debug\*.*" "$(ProjectDir)..\References"   即把当前项目目录下的Bin\Debug文件夹下的所有文件拷贝到和当前项目同级的References文件夹下

 

上面用到了"$(SolutionDir)"这种表示路径的方式,这是VS能自动识别的。当然不只是这一个,通过查看MSDN还有其他预定义的路径表示方法:具体可参见MSDN,这里我把它复制下来:

具体可参见MSDN:http://msdn.microsoft.com/zh-cn/library/42x5kfw4(VS.80).aspx

宏  说明 
$(ConfigurationName)
 当前项目配置的名称(例如,“Debug|Any CPU”)。
 
$(OutDir)
 输出文件目录的路径,相对于项目目录。这解析为“输出目录”属性的值。它包括尾部的反斜杠“\”。
 
$(DevEnvDir)
 Visual Studio 2005 的安装目录(定义为驱动器 + 路径);包括尾部的反斜杠“\”。
 
$(PlatformName)
 当前目标平台的名称。例如“AnyCPU”。
 
$(ProjectDir)
 项目的目录(定义为驱动器 + 路径);包括尾部的反斜杠“\”。
 
$(ProjectPath)
 项目的绝对路径名(定义为驱动器 + 路径 + 基本名称 + 文件扩展名)。
 
$(ProjectName)
 项目的基本名称。
 
$(ProjectFileName)
 项目的文件名(定义为基本名称 + 文件扩展名)。
 
$(ProjectExt)
 项目的文件扩展名。它在文件扩展名的前面包括“.”。
 
$(SolutionDir)
 解决方案的目录(定义为驱动器 + 路径);包括尾部的反斜杠“\”。
 
$(SolutionPath)
 解决方案的绝对路径名(定义为驱动器 + 路径 + 基本名称 + 文件扩展名)。
 
$(SolutionName)
 解决方案的基本名称。
 
$(SolutionFileName)
 解决方案的文件名(定义为基本名称 + 文件扩展名)。
 
$(SolutionExt)
 解决方案的文件扩展名。它在文件扩展名的前面包括“.”。
 
$(TargetDir)
 生成的主输出文件的目录(定义为驱动器 + 路径)。它包括尾部的反斜杠“\”。
 
$(TargetPath)
 生成的主输出文件的绝对路径名(定义为驱动器 + 路径 + 基本名称 + 文件扩展名)。
 
$(TargetName)
 生成的主输出文件的基本名称。
 
$(TargetFileName)
 生成的主输出文件的文件名(定义为基本名称 + 文件扩展名)。
 
$(TargetExt)
 生成的主输出文件的文件扩展名。它在文件扩展名的前面包括“.”。