CopyLocal 之痛
- 2019 年 10 月 5 日
- 筆記
怪事年年有,今年特別多。
今天,我機子上好好的一個vs 2008的項目,拷到同事的機子上後,竟然不能運行,報「未能載入程式集」的錯誤。一看才知道,所有的程式集引用(除了System下的)的「複製本地」屬性,都為false。奇了怪了,在我這裡不是好好的true嗎?
無奈,卸載項目,然後編輯csproj文件,發現每個引用下面,其實根本就沒有指定CopyLocal屬性!
重新載入項目,然後把它設成true,然後再打開csproj文件,發現多出來一個節點:
看來Private就是用來指定CopyLocal的值的了。如果沒這個節點的話,vs會有一個默認值。這個默認值怎麼決定的?查到msdn上關於CopyLocal的描述如下:
The project-assigned value of CopyLocal is determined in the following order:
- If the reference is another project, called a project-to-project reference, then the value is true.
- If the assembly is found in the global assembly cache, the value is false.
- As a special case, the value for the mscorlib.dll reference is false.
- If the assembly is found in the Framework SDK folder, then the value is false.
- Otherwise, the value is true.
馬上按照上面提到的情況去對照自己的項目,但沒有一個對的上的,看來文檔這東西要搞好也不容易,即使是ms也不例外。後來想到,是否vs有個選項可以設置這個默認值的呢?找了一下也沒找到。不過即便找到了,也不是一個好的解決辦法,因為你不能奢望別人也去修改這個選項。看來以後自己在添加引用的時候,一定要確保每個引用節點下面有這個<private>true/false</private>了,這豈不是得累死了?以後再打開別人的項目的時候,就算在Solution Explorer里看到某個引用的CopyLocal是true或是false,也不敢確定這就是作者的原意了,就算打開csproj文件去看對應的節點,也不敢確定,因為很有可能那裡沒有private節點,而你不能保證作者的vs默認的是什麼,累啊。
不知各位有沒有發現這個問題呢?