.NET 框架兼容性简介
前言
從.NET框架4.0開始,所有主版本號(hào)為4(稱為“4.x”版本)的.NET框架,都會(huì)進(jìn)行就地更新。這就意味著在一段時(shí)間內(nèi),電腦上安裝的只有一個(gè).NET 4.x框架。安裝.NET 4.5框架將替換.NET 4.0框架,.NET 4.5.1框架將替換.NET 4.5框架,.NET 4.6框架將替換.NET 4.5.1,以此類推。
由于這些就地更新的特點(diǎn),原本在.NET 4.0框架上運(yùn)行的應(yīng)用程序,在電腦安裝的.NET框架升級(jí)后,可能需要在.NET 4.6上運(yùn)行。.NET 4.x框架之間的兼容性是非常高的,因此在.NET 4.x框架下正常工作的應(yīng)用程序,通常也會(huì)在較新版本的.NET框架下正常運(yùn)行。然而不同的.NET 4.x框架會(huì)有一些變化,因此應(yīng)用程序應(yīng)該在其將運(yùn)行的任何版本的.NET框架上測(cè)試下。
本文概述了最佳做法和工具,用來(lái)使支持新的.NET 版本更容易。
?
發(fā)生了哪些變化?為什么?
對(duì)于.NET 團(tuán)隊(duì)來(lái)說(shuō),和之前版本的.NET框架的兼容性,是一個(gè)高優(yōu)先級(jí)的工作。事實(shí)上,.NET框架所有的更改都是由經(jīng)驗(yàn)豐富的工程師進(jìn)行審核,他們會(huì)對(duì)這些改變?cè)诳蛻舻膽?yīng)用程序上的影響進(jìn)行評(píng)估。
盡管如此,仍然存在兼容性問(wèn)題。原因之一是,在更新.NET框架時(shí),兼容性并不是唯一的優(yōu)先事項(xiàng)。有時(shí),由于功能性的原因,不得不進(jìn)行更改,來(lái)解決某個(gè)安全漏洞,或者是支持某個(gè)行業(yè)標(biāo)準(zhǔn)。
還有一些偶然發(fā)生的兼容性問(wèn)題。.NET框架團(tuán)隊(duì)會(huì)進(jìn)行全面的兼容性測(cè)試,以防止這些問(wèn)題,但仍然會(huì)漏掉一些問(wèn)題。還有更復(fù)雜的情況,修復(fù)兼容性問(wèn)題本身就是一種影響兼容性的改變(因?yàn)橛行┯脩艨赡芤蕾囉谶@些無(wú)意的新行為)。在這樣的情況下(解決無(wú)意的行為更改),.NET框架團(tuán)隊(duì)常常會(huì)使用一個(gè)稱為“quirking”的解決方案。
?
Quirking和目標(biāo).Net框架
Quirking指的是對(duì)于緩解兼容性問(wèn)題,在.NET 框架中有兩個(gè)單獨(dú)的代碼路徑,并且選擇一種作為應(yīng)用程序的目標(biāo).NET 框架版本的路徑。這種方式緩解了許多.NET 框架兼容性的問(wèn)題,因?yàn)閼?yīng)用程序在較新的.NET框架上運(yùn)行時(shí),只要在沒(méi)有變化的目標(biāo).NET框架中運(yùn)行,就避免了很多潛在的問(wèn)題。Quirking行為是被應(yīng)用程序的目標(biāo).NET框架自動(dòng)確定,但可以由開發(fā)人員使用應(yīng)用程序或計(jì)算機(jī)配置設(shè)置來(lái)進(jìn)行重寫。雖然通過(guò)奇想行為減輕了很多兼容性的問(wèn)題,但是由于安全方面的考慮,以及技術(shù)上的限制,并不是所有的兼容性問(wèn)題都可以被Quirking行為解決。
舉一個(gè)例子,如果一個(gè)目標(biāo).NET框架是4.5的應(yīng)用程序,在安裝了.NET 4.5.2的電腦上運(yùn)行,即使在較新的框架上執(zhí)行應(yīng)用程序,為了減少兼容性問(wèn)題,它也會(huì)模擬.NET 4.5的行為。
目前,?微軟對(duì).NET 4.0,4.5?和?4.5.1已?停止支持,但是需要特別注意的是,根據(jù)新.NET框架的支持政策,?以那些低版本為目標(biāo).NET框架的應(yīng)用程序在高版本的.NET框架上的正常運(yùn)行,將會(huì)繼續(xù)得到支持。
目標(biāo)版本是在創(chuàng)建應(yīng)用程序域 (通常是在托管可執(zhí)行文件啟動(dòng)時(shí))時(shí),由應(yīng)用程序的主程序集的目標(biāo)框架屬性決定的。此屬性可以通過(guò)以下方式設(shè)置︰
可以在?Visual Studio 中指定項(xiàng)目的目標(biāo)框架。
可以直接在項(xiàng)目文件中指定項(xiàng)目的目標(biāo)框架
可以直接在項(xiàng)目的源代碼中的目標(biāo)框架屬性指定目標(biāo)框架。
請(qǐng)注意,MSBuild 會(huì)基于項(xiàng)目的目標(biāo)框架名稱,自動(dòng)添加目標(biāo)框架屬性,所以此屬性只應(yīng)在非 MSBuild 場(chǎng)景中直接使用。如果使用 MSBuild,就必須通過(guò)使用以前鏈接的項(xiàng)目文件來(lái)設(shè)置調(diào)整目標(biāo)框架。
Quirking設(shè)置是?應(yīng)用程序域?范圍。在大多數(shù)情況下,類庫(kù)(dll的)將根據(jù)依賴于于它們的可執(zhí)行文件,而使用或者不使用quirking。正因?yàn)槿绱?#xff0c;即使沒(méi)有quirking應(yīng)用,創(chuàng)建者的共享庫(kù)可能需要確保他們的代碼能夠正常工作。
?
兼容性開關(guān)
除了基于目.NET標(biāo)框架的自動(dòng)急轉(zhuǎn)之外,開發(fā)人員可以通過(guò)設(shè)置兼容性開關(guān),明確選擇使用或者不使用影響兼容性的變化,手動(dòng)啟用或禁用個(gè)別兼容性急轉(zhuǎn)(以及其他一些不是自動(dòng)急轉(zhuǎn)的行為)。這些“兼容性開關(guān)”對(duì)于允許開發(fā)人員把較新版本的.NET框架作為目標(biāo).NET框架(為了使用.NET的新功能)時(shí)非常有用,這樣仍然可以選擇不使用一些已知的會(huì)影響應(yīng)用程序的改動(dòng)。兼容性開關(guān)設(shè)置方式有以下幾種:
通過(guò)配置文件設(shè)置
通過(guò)環(huán)境變量設(shè)置
在項(xiàng)目的源代碼中以編程方式設(shè)置
如何設(shè)置兼容性開關(guān)的詳細(xì)信息,雖然沒(méi)有在這篇介紹性的博客中提到,但在后續(xù)的跟進(jìn)中,會(huì)有關(guān)于這方面更多深入的細(xì)節(jié)。
在?MSDN?上關(guān)于兼容性問(wèn)題的文檔中,經(jīng)常會(huì)提到兼容性開關(guān),需要時(shí)可以查閱。
?
兼容性問(wèn)題文檔
所有已知的.NET 框架兼容性問(wèn)題都記錄在 MSDN?上。
從.NET 框架 4.5.1 開始,兼容性問(wèn)題被列為“運(yùn)行時(shí)更改” 或 “重定向更改”。
運(yùn)行時(shí)更改,指的是影響任意應(yīng)用程序在較新的.NET 框架版本 (這些變化不是quirking) 上運(yùn)行的更改。
重定向更改,指的是只影響應(yīng)用程序重新以較新.NET框架為目標(biāo)框架生成的更改。這些是.NET 框架變化,或者是編譯工具的變化。對(duì)于.NET 4.0 和 .NET 4.5 之間的變化,在兼容性問(wèn)題表的項(xiàng)目里,運(yùn)行時(shí)和重定向的區(qū)別并不顯示,但可以通過(guò)閱讀說(shuō)明來(lái)進(jìn)行區(qū)分。
除了 MSDN 上面的文檔,.NET 框架兼容性問(wèn)題都可以作為標(biāo)記文件?,是可供使用的兼容性工具(見下文)。可以通過(guò)直接讀取參考文件 (或在列表的?MSDN 鏡像中), 來(lái)了解有關(guān)兼容性的問(wèn)題。這個(gè)參考文件是開源 GitHub 存儲(chǔ)庫(kù)中的一部分,可以提交請(qǐng)求,或者創(chuàng)建任何需要修正的問(wèn)題。.NET 團(tuán)隊(duì)會(huì)將參考文件上面的信息和 MSDN 上的信息進(jìn)行同步。
?
編譯器的兼容性問(wèn)題
除了上文提到的.NET 框架運(yùn)行時(shí)和重定向的兼容性問(wèn)題之外,在不能進(jìn)行急轉(zhuǎn)的C#和VB編輯器版本之間,還有一小部分不會(huì)發(fā)生在運(yùn)行時(shí)的更改問(wèn)題。例如,由于C# 4.0 編譯器和 5.0 C# 編譯器 在生成中間語(yǔ)言時(shí)的極小差異,開發(fā)人員在新的編輯器中重新編譯應(yīng)用程序的時(shí)候,必須留意此類問(wèn)題。
因?yàn)檫@些兼容性問(wèn)題僅在新的編譯器中重新編譯時(shí)才會(huì)顯現(xiàn),所以它們不會(huì)影響到以前編譯過(guò)的二進(jìn)制文件在新版本的.NET 框架上運(yùn)行。為此,MSDN 文檔中將這些問(wèn)題歸類為重定向的變化。兼容性問(wèn)題標(biāo)記文檔會(huì)將編譯器兼容性問(wèn)題標(biāo)記為“編譯時(shí)”的重定向的更改問(wèn)題,這種問(wèn)題和 “quirking “ 重定目標(biāo)更改有一些差異。
?
問(wèn)題識(shí)別工具
在 GitHub 上發(fā)布兼容性問(wèn)題標(biāo)記文件的主要目的,是為了兼容性工具的使用。這些工具使得從一個(gè).NET 框架版本到另一個(gè)的遷移變得比較容易。現(xiàn)在,我們介紹以下兩個(gè)兼容性分析工具集。
API移植性分析器
ApiPort?(該工具的簡(jiǎn)稱),它能夠掃描二進(jìn)制文件,并標(biāo)識(shí)應(yīng)用程序接口(以下簡(jiǎn)稱API)使用的所有.NET 框架。然后,它將這些 API和兼容性問(wèn)題參考文件中存儲(chǔ)的數(shù)據(jù)進(jìn)行比較,并針對(duì)所使用的API提供一份報(bào)告,是關(guān)于一個(gè).NET框架4.x和另一個(gè)版本之間的API的一些更改。命令行選項(xiàng)可以縮小掃描范圍 (例如,只考慮指定的.NET 框架版本之間的更改)。完整文檔請(qǐng)參閱ApiPort中斷更改掃描使用說(shuō)明。使用ApiPort工具時(shí),需要牢記的注意事項(xiàng)有以下兩點(diǎn):
因?yàn)?ApiPort 只關(guān)注API調(diào)用的.NET,因此它有可能會(huì)發(fā)一些誤報(bào)。大多數(shù).NET 兼容性問(wèn)題只影響某個(gè)API的特定代碼路徑。簡(jiǎn)單地使用這些 API,并不意味著應(yīng)用程序就會(huì)受到兼容性問(wèn)題的影響。通讀更改說(shuō)明,以確定所報(bào)告的問(wèn)題是否有可能在你的特定應(yīng)用程序中出現(xiàn)。
因?yàn)?ApiPort 只關(guān)注API調(diào)用的.NET,一些兼容性問(wèn)題無(wú)法通過(guò)此工檢測(cè)出來(lái)。例如,當(dāng)只掃描中間語(yǔ)言時(shí),在 WPF 應(yīng)用程序中使用已更改的 XAML 控件可能不會(huì)被發(fā)現(xiàn)。 ApiPort 是一個(gè)很有用的工具,但不能替代兼容性測(cè)試的。
.NET?框架兼容性分析器
.NET 框架兼容性分析器是一整套Roslyn診斷代碼分析器,其使用源代碼中的語(yǔ)法樹以及語(yǔ)義模型,從而更智能地決定一個(gè)項(xiàng)目是否會(huì)遇到兼容性問(wèn)題。他們?nèi)匀粫?huì)存在誤報(bào),但相比ApiPort 工具會(huì)準(zhǔn)確很多。
這些工具可以通過(guò)在NuGet.org?網(wǎng)頁(yè)上搜索?Microsoft.DotNet.FrameworkCompatibilityDiagnostics得到。.NET 框架團(tuán)隊(duì)目前正在對(duì)這些分析器開放資源碼。想要獲得更多的在開放資源代碼成果的更新,請(qǐng)關(guān)注這個(gè)博客。
?
報(bào)告新的兼容性問(wèn)題
當(dāng)把應(yīng)用程序從一個(gè).NET 框架版本遷移到另一個(gè)的時(shí)候,你偶爾可能會(huì)遇到在 MSDN 或 ApiPort 參考文件中沒(méi)有記錄的兼容性問(wèn)題。如果這種情況發(fā)生,請(qǐng)讓我們知道!.NET 團(tuán)隊(duì)將會(huì)不斷地保持兼容性文檔最新。
在.NET 框架中,沒(méi)有文檔說(shuō)明的兼容性問(wèn)題可以用以下方式報(bào)告:
使用 Visual Studio 里面的”發(fā)送笑臉”反饋功能來(lái)發(fā)送詳細(xì)的變更。
在ApiPort存儲(chǔ)庫(kù)中創(chuàng)建問(wèn)題來(lái)題記錄那些還沒(méi)有被記錄在工具的標(biāo)記文件中的.NET 框架兼容性問(wèn)題。.NET 的團(tuán)隊(duì) (或社區(qū)成員) 將會(huì)調(diào)查并適當(dāng)?shù)奶砑游臋n和支持。
?
結(jié)語(yǔ)
.NET 框架力求與每個(gè)新的框架版本高度兼容。盡管如此,一些兼容性問(wèn)題仍然是不可避免的。了解這些變化,并且知道怎樣去緩解這些問(wèn)題,可以保持你的應(yīng)用程序在新版本的.NET 框架上成功運(yùn)行。
本文提及的一些兼容性最佳做法包括:
不是必須的情況,不要重定向?yàn)檩^新版本的.NET框架來(lái)作為目標(biāo)框架。因?yàn)檫@樣應(yīng)用程序可以利用兼容性”quirking”功能,從而使兼容性問(wèn)題減少到最低限度。
如果你在用來(lái)運(yùn)行你的應(yīng)用程序的.NET 框架版本上有任何的控件,就使用較新版本的.NET 框架。這是因?yàn)?NET4.x上面的許多兼容性問(wèn)題已經(jīng)在后續(xù)版本中得到了修復(fù)。例如,在4.0 至 4.6 之間的兼容性問(wèn)題就比4.0到4.5之間的兼容性問(wèn)題少。
如果應(yīng)用程序是使用較新的編譯器重新編譯的,就一定要確保進(jìn)行徹底的測(cè)試。這可以暴露編譯器兼容性問(wèn)題 (雖然這些問(wèn)題很少見)。
使用兼容性工具找出潛在問(wèn)題,常用的工具有?API 移植性分析器和.NET 框架兼容性分析器。
在你期望運(yùn)行的所有.NET 框架版本上,測(cè)試你的應(yīng)用程序。
使用這些技術(shù),應(yīng)用程序?qū)?huì)繼續(xù)在新版本的.NET 框架中運(yùn)行。
?
相關(guān)資料
MSDN.NET 遷移指南
MSDN 的兼容性問(wèn)題列表
NET API移植性分析器
.NET 框架兼容性分析器
.NET 框架支持生命周期
原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/05/02/introduction-to-net-framework-compatibility/
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的.NET 框架兼容性简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 拥抱.NET Core,跨平台的轻量级R
- 下一篇: ASP.NET Core Docker部