編譯.NET項目提示“找不到系統命名空間,請添加系統組件的引用”問題的解決方案(該組件已被該項目正確引用)
來源:互聯網
上載者:User
早幾天,一個同事遠程登入到我的機器,對我的一個項目進行了些修改。昨天,我開啟改項目編譯,一大堆的“找不到系統命名空間,請添加組件引用”的錯誤,我一看,這些系統組件都已被正確引用,只好把它們全部刪除,再添加引用,這下好了,編譯通過。
今天再開啟該項目進行編譯,又提示同樣的錯誤,而那些系統組件還是已經被正確引用,於是,我又按昨天的方法把問題解決了。接著關閉vs20003,再編譯,同樣的錯誤又出現了。系統組件還是被引用,但是,我發現那些組件都被複製到了項目的bin目錄下,一看組件屬性,複製到本地都是"true",於是,我把他們全部刪除,再全部添加,並且把“複製到本地”的屬性改為"false",編譯通過,一看,那些系統組件又莫名奇妙地複製到了bin目錄下,並且我手動設定的"false"又全部變成"true"了。一般來說,系統組件的“複製到本地”屬性是"false",只是對C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322下組件的引用罷了,不會把檔案複製到bin目錄下,而我的項目,卻偏偏相反,而且,手動改了後又被vs2003自動改回去了。失望之及,準備重建立項目,再把所有的檔案添加進去,但是,又覺得太麻煩了,還是再看看有沒有更省時省力的解決方案吧。
於是,我開始查看項目屬性,如所示的引用路徑設定引起了我的注意
(註:開始是沒C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\這項的)一看,上面有對自身bin目錄的引用,也有對外部組件路徑的引用(指E:\My Program\ITEasy\ITEasy.Common\bin\Debug),而沒有對系統組件路徑的引用,於是我試著把C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\添加進去,再編譯,還是不通過。於是,我把系統組件都刪除,添加後在編譯,果然可以,但是關閉vs2003後再編譯,又出現同樣的錯誤,系統組件還是被複製到了bin目錄下。這時,我想是不是跟上面引用路徑的順序有關,不然上面怎麼會有設定順序的按鈕呢於是把C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\調到第一的問題,再刪除系統組件,添加後編譯通過,再關閉vs2003,編譯依然通過,終於把這鬱悶的問題解決了。
總結:除了每個組件的“複製到本地”屬性外,項目的“引用路徑”設定也會到組件的引用方式起作用。當引用一個組件的時候,會尋找“引用路徑”設定裡的路徑,如果改路徑不存在,比如系統組件路徑,則vs2003會自動把改組件複製到項目bin目錄下,而不管改被添加組件的“複製到本地”屬性是什麼。但是,我又發現,建立的項目雷根本沒有對C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\的引用,只有對自身bin目錄的引用,我想可能是vs2003的自動機制,建立項目的時候就已經預設了系統組件的路徑,雖然在“引用路徑”裡看不到,但是,它卻把對它的引用放到了第一位,這個也可以從另一方面看到,我們注意到建立項目的時候vs2003自動給我添加了常用系統組件的引用,而且這些組件在bin目錄下並沒有副本,也就是說只是對系統組件路徑的引用而已。也許是我同事改了什麼,改變了vs2003的預設路徑規則,讓它不再把沒出現在“引用路徑”設定中的C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\作為首選路徑,而是該項目的bin目錄作為了首選路徑,這也就是我編譯的時候找不到組件的原因。到現在,我也不知道到底是哪裡改變了vs2003的預設路徑引用規則,或許根本就沒什麼改變了它,而是vs2003開發人員的疏忽,既然把C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\作為首選路徑,為什麼在項目的“引用路徑”設定裡沒它的身影呢?而做了某些操作後,又撤消了這一預設規則,而是根據“引用路徑”設定來載入組件。
有深入瞭解的高手,請指點一二。