第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

程序集引用的“特定版本”屬性在Visual Studio中的工作原理是什么?

程序集引用的“特定版本”屬性在Visual Studio中的工作原理是什么?

PIPIONE 2019-08-09 17:16:28
程序集引用的“特定版本”屬性在Visual Studio中的工作原理是什么?今天,我仔細研究了Visual Studio 2010中程序集引用的“特定版本”屬性。經過一些意外結果的實驗后,我開始盡可能多地了解該屬性的工作原理。即便如此,在我看來,并沒有得到所有的答案,所以這是我嘗試自我回答這個問題:如何準確地做在Visual Studio程序集引用作品的“特定版本”屬性?
查看完整描述

2 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

這是一個編譯時的屬性!

一要知道最重要的事情是,“特定版本”是,需要在效果的屬性編譯時運行時。

這是什么一回事呢?

構建項目時,需要解析項目的程序集引用,以便查找構建系統(tǒng)應使用的物理程序集。如果執(zhí)行“特定版本”檢查(請參閱“何時”特定版本“選中?”部分),則會影響裝配解決過程的結果:

  • 構建系統(tǒng)定位它可能使用的物理程序集

  • 構建系統(tǒng)將物理程序集的版本與存儲在.csproj文件中的程序集版本進行比較,以獲得程序集引用

  • 如果兩個程序集版本完全相同,則解析過程成功,找到的物理程序集用于構建

  • 如果兩個組件版本不匹配,則丟棄物理組件,并通過定位下一個可能的組件繼續(xù)解析過程

  • 如果無法找到更多可能的物理組件,則解析過程將失敗。這會導致編譯器警告(警告MSB3245),告訴您無法解析引用。

  • 有趣的是,構建然后繼續(xù)!如果代碼沒有對程序集的實際引用,則構建成功(使用前面提到的警告)。如果代碼具有引用,則構建將失敗,并顯示錯誤,該錯誤看起來好像代碼使用的是未知類型或命名空間。構建真正失敗的唯一跡象是警告MSB3245。

解決裝配的順序

程序集解析過程查找潛在程序集的順序如下所示:

  1. <HintPath>.csproj文件中的元素引用的程序集

  2. 項目輸出路徑

  3. 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”但由于“特定版本”檢查而導致程序集解析過程失敗,則不會復制任何程序集。


查看完整回答
反對 回復 2019-08-09
?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

添加引用時,Visual Studio會在項目文件中記錄程序集的[AssemblyVersion]。這個很重要。例如,如果您在一年后創(chuàng)建了一個錯誤修復程序,那么您需要確保使用完全相同的引用版本重新構建項目,這樣才能真正實現這一目標。如果引用程序集已更改,您將收到錯誤。

但這并不總是令人滿意的。一些程序員讓程序集版本自動遞增,每次重建時都會生成一個新版本。盡管程序集的公共接口從未改變過。有些人通過使用Nuget獲取庫來配置他們的項目,并在有新版本可用時讓它自動更新庫。他們希望將Specific Version屬性設置為False以抑制編譯錯誤。

了解后果非常重要,您需要重新部署整個程序版本以避免事故。運行時版本不匹配導致程序崩潰,只能使用<bindingRedirect>.config文件中的a進行抑制,這樣做有風險。


查看完整回答
反對 回復 2019-08-09
  • 2 回答
  • 0 關注
  • 1309 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號