2 回答

TA貢獻1712條經驗 獲得超3個贊
這是一個編譯時的屬性!
一要知道最重要的事情是,“特定版本”是,需要在效果的屬性編譯時和不運行時。
這是什么一回事呢?
構建項目時,需要解析項目的程序集引用,以便查找構建系統(tǒng)應使用的物理程序集。如果執(zhí)行“特定版本”檢查(請參閱“何時”特定版本“選中?”部分),則會影響裝配解決過程的結果:
構建系統(tǒng)定位它可能使用的物理程序集
構建系統(tǒng)將物理程序集的版本與存儲在.csproj文件中的程序集版本進行比較,以獲得程序集引用
如果兩個程序集版本完全相同,則解析過程成功,找到的物理程序集用于構建
如果兩個組件版本不匹配,則丟棄物理組件,并通過定位下一個可能的組件繼續(xù)解析過程
如果無法找到更多可能的物理組件,則解析過程將失敗。這會導致編譯器警告(警告MSB3245),告訴您無法解析引用。
有趣的是,構建然后繼續(xù)!如果代碼沒有對程序集的實際引用,則構建成功(使用前面提到的警告)。如果代碼具有引用,則構建將失敗,并顯示錯誤,該錯誤看起來好像代碼使用的是未知類型或命名空間。構建真正失敗的唯一跡象是警告MSB3245。
解決裝配的順序
程序集解析過程查找潛在程序集的順序如下所示:
由
<HintPath>
.csproj文件中的元素引用的程序集項目輸出路徑
GAC
請注意,如果GAC中存在多個版本的程序集,則解析過程首先嘗試解析為具有最高版本的程序集。僅在未進行“特定版本”檢查時,這一點很重要。
何時檢查“特定版本”?
Visual Studio決定是否對.csproj文件中的兩條信息執(zhí)行“特定版本”檢查:
<SpecificVersion>
元素的存在與否及其值(如果存在)程序集引用中是否存在版本信息
這是帶有版本信息的典型程序集引用的樣子:
<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL"> <SpecificVersion>True</SpecificVersion> <HintPath>..\..\Bar\Foo.dll</HintPath></Reference>
這就是沒有版本信息時程序集引用的樣子:
<Reference Include="Foo">[...]
下表顯示執(zhí)行“特定版本”檢查的時間,以及何時不執(zhí)行。
| Version information
| Present Not present
----------------------------+------------------------------
<SpecificVersion> |
- Present, has value True | Yes (1) Yes (check always fails) (2)
- Present, has value False | No (3) No (4)
- Not present | Yes (5) No (6)
令人驚訝的是,如果<SpecificVersion>
不存在和版本信息,則不執(zhí)行檢查(案例6)。我本以為要執(zhí)行檢查并且總是失?。ㄅc案例2相同),因為在我的理解中,缺少<SpecificVersion>
意味著默認值“True”。這可能是Visual Studio 2010的一個怪癖,我在那里進行了測試。
在Visual Studio UI中檢查程序集引用的屬性(選擇引用并按F4)時,您在“特定版本”屬性中看到的值會告訴您Visual Studio是否要執(zhí)行“特定版本”校驗。在案例6中,UI將顯示“True”,盡管該<SpecificVersion>
元素不存在于.csproj文件中。
對“復制本地”的副作用
如果“復制本地”屬性設置為“True”但由于“特定版本”檢查而導致程序集解析過程失敗,則不會復制任何程序集。

TA貢獻1834條經驗 獲得超8個贊
添加引用時,Visual Studio會在項目文件中記錄程序集的[AssemblyVersion]。這個很重要。例如,如果您在一年后創(chuàng)建了一個錯誤修復程序,那么您需要確保使用完全相同的引用版本重新構建項目,這樣才能真正實現這一目標。如果引用程序集已更改,您將收到錯誤。
但這并不總是令人滿意的。一些程序員讓程序集版本自動遞增,每次重建時都會生成一個新版本。盡管程序集的公共接口從未改變過。有些人通過使用Nuget獲取庫來配置他們的項目,并在有新版本可用時讓它自動更新庫。他們希望將Specific Version屬性設置為False以抑制編譯錯誤。
了解后果非常重要,您需要重新部署整個程序版本以避免事故。運行時版本不匹配導致程序崩潰,只能使用<bindingRedirect>
.config文件中的a進行抑制,這樣做有風險。
- 2 回答
- 0 關注
- 1309 瀏覽
添加回答
舉報