一、設置特定版本屬性
二、屬性說明
1.“特定版本”這個屬性僅在編譯時有效,在程序運行時,不發揮作用。
2.編譯項目時,需要解析項目的程序集引用,以便找到編譯時應使用的物理程序集(.dll文件)。
如果“特定版本”被設置為true,它會影響程序集解析過程,執行如下特定版本信息的檢查(假設引用中存在版本信息):
(1)編譯系統定位它可能使用的所有物理程序集
(2)編譯系統比較“具體的物理程序集的版本”與“ .csproj 文件中存儲的程序集版本”,以確定是否使用這個物理程序集:
如果兩個程序集版本完全相同,則解析過程成功,找到了用於編譯的物理程序集;
如果兩個程序集版本不匹配,則丟棄這個物理程序集。
解析過程繼續進行(編譯系統定位到下一個候選的物理程序集);
(3)如果找不到更多候選的物理程序集,則解析過程失敗。
這會導致編譯器發出警告(警告 MSB3245),告訴您無法解析引用。
有趣的是,編譯工作仍然會繼續下去!如果代碼沒有對程序集的實際引用,則編譯成功(帶有前面提到的警告)。如果代碼里有引用,則編譯失敗並顯示錯誤,告訴您代碼使用了未知類型或命名空間。
3.編譯系統解析物理程序集的順序
(1).csproj 文件中 <HintPath> 元素指定的
(2)項目輸出路徑(/Debug目錄)
(3)GAC
請注意,在“特定版本”為false時,如果 GAC 中存在多個版本的程序集,則解析過程首先嘗試解析具有最高版本的程序集。
4.編譯時是否執行引用的特定版本檢查,依據2個來自.csproj文件的信息:
- 是否存在
<SpecificVersion>
標簽,以及它的值 (如果標簽存在) - 引用標簽<Reference>是否含有版本信息
以下例子,既有<SpecificVersion>
標簽和它的值 True ,也有版本信息:Version=1.2.3.4
<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL"> <SpecificVersion>True</SpecificVersion> <HintPath>..\..\Bar\Foo.dll</HintPath> </Reference>
編譯時是否執行引用的特定版本檢查的回答,如下表:
5.對“復制本地”的影響
如果“復制本地(Copy Local)”屬性設置為“True”,但程序集解析過程因“特定版本”檢查而失敗,則不會復制任何程序集到輸出目錄(/Debug)。