當項目比較龐大時候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)
產生的主輸出檔案的副檔名。它在副檔名的前麵包括“.”。