有時編譯比較大的C#專案檔,會遇到一個非常令人頭疼的異常:不能複製XXX到XXX目錄,因為它與依賴項衝突。但是檢查後會發現,沒有任何編譯錯誤。
此問題的參考解決辦法是:
1:搜尋項目所在檔案夾下的動態產生的檔案,全部幹掉!
在搜尋欄輸入:*.exe,*.dll,*.pdb,*.scc,*.xml,*.resources,*.projdata (注意:靜態引用的檔案不要刪除)
然後重新編譯,一般情況下這個方法十分奏效。
2:由於你一開始的設計混亂無比,各個組件相互引用十分複雜的時候,這個警告或錯誤就會出現。
假設有一個項目同時被三個不同的項目引用,三個中的一個被三個中的另一個引用,而這三個項目又被另一個引用……好了,我已經頭暈了,而vs不會暈,它會老實的根據生產順序來生產這些程式集。這樣先生產的有一個版本號碼,後來產生的又有一個版本號碼,最後的結果是你要用同一個程式集的不同版本來運行,而很明顯,一個程式集只需要一個,這樣問題就來了:vs想要替換掉先進來的dll,但是這個dll是另一個項目生產所必須的……輕的只是警告,嚴重的時候產生錯誤會讓你無法編譯項目!
要解決這個問題,先要說一下程式集的版本控制……好了,現在明白了吧,對這個問題最簡單的解決辦法就是找到項目的AssemblyInfo.cs檔案,將裡面的[assembly: AssemblyVersion("1.0.*")]改成你自己的版本號碼,比如[assembly: AssemblyVersion("1.0.3")]。這樣程式集的版本就不會自己調節,而是根據你指定的版本數字來定。這樣子不論你把項目編譯多少次,版本號碼始終是你自訂的那個號碼,而最後的結果就是不會出現本文標題所示的錯誤了。
3:根據提示,找到不能複製的類庫,然後搜尋當前工作目錄下的所有該類庫,全部刪掉。然後更改各個項目的引用路徑,只保留當前工作目錄,其它刪掉。一般情況下該方法也比較有效。
4:如果以上3種方法都無法解決您的問題,那麼我們就得出絕招了(此招比較狠毒,慎用)!找到不能複製的類庫名稱,然後搜尋硬碟裡的所有該DLL(要備份),全部刪除。然後再編譯,此問題顯然已經解決了。