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:

  1. If the reference is another project, called a project-to-project reference, then the value is true.
  2. If the assembly is found in the global assembly cache, the value is false.
  3. As a special case, the value for the mscorlib.dll reference is false.
  4. If the assembly is found in the Framework SDK folder, then the value is false.
  5. Otherwise, the value is true.

馬上按照上面提到的情況去對照自己的項目,但沒有一個對的上的,看來文檔這東西要搞好也不容易,即使是ms也不例外。後來想到,是否vs有個選項可以設置這個默認值的呢?找了一下也沒找到。不過即便找到了,也不是一個好的解決辦法,因為你不能奢望別人也去修改這個選項。看來以後自己在添加引用的時候,一定要確保每個引用節點下面有這個<private>true/false</private>了,這豈不是得累死了?以後再打開別人的項目的時候,就算在Solution Explorer里看到某個引用的CopyLocal是true或是false,也不敢確定這就是作者的原意了,就算打開csproj文件去看對應的節點,也不敢確定,因為很有可能那裡沒有private節點,而你不能保證作者的vs默認的是什麼,累啊。

不知各位有沒有發現這個問題呢?