遇見最美Windows 11之現代Windows桌面應用開發 - 探索.Net framework和CLR版本關系


背景

托管公共語言運行時(CLR)的所有應用程序都必須啟動(或激活)CLR,才能運行托管代碼。通常,.NET Framework應用在生成它的CLR版本上運行,但你可以使用應用程序配置文件(有時稱為app.config文件)來更改桌面應用程序的此行為。

如果CLR激活系統無法加載應用程序所需運行時的正確版本,它將向用戶顯示一條錯誤消息,通知他們,他們的計算機未正確配置,無法運行該應用程序,並為他們提供機會來修復該問題。在此情況下通常會顯示以下錯誤消息。用戶可以選擇“是”以轉到Microsoft網站,從中為應用程序下載正確的.NETFramework版本。

image

若要解決根本問題並提供最佳用戶體驗(更少錯誤消息),建議執行以下操作:

  • 對於.NET Framework 3.5(和更低版本)應用程序:將應用程序配置為支持.NET Framework 4或更高版本
  • 對於.NET Framework 4應用程序:安裝.NET Framework 4可再發行組件包,作為應用程序安裝的一部分

Windows 8/10/11行為和UI

CLR激活系統在Windows 8/10/11上提供與在其他版本Windows操作系統上一樣的行為和UI,除非加載CLR 2.0時遇到問題。Windows 8包括使用CLR 4.5的.NET Framework 4.5。但是,Windows 8不包括.NET Framework 2.0、3.0或3.5,它們都使用CLR 2.0。結果,依賴於CLR 2.0的應用程序默認情況下在Windows 8上不運行。相反,它們將顯示下面的對話框,使用戶能夠安裝.NET Framework 3.5。用戶還可在“控制面板”中啟用.NET Framework 3.5。

image

安裝.NET Framework 3.5后,用戶可以在其Windows8計算機上運行依賴於.NET Framework 2.0、3.0或3.5的應用程序。他們還可以運行.NET Framework 1.0和1.1應用程序,前提是這些應用程序未顯式配置為僅在.NET Framework 1.0或1.1版上運行。

什么是通用語言運行庫CLR

image

通用語言執行平台(Common Language Runtime,簡稱CLR)是微軟為.NET的虛擬機所選用的名稱。它是微軟對通用語言架構(CLI)的實現版本,它定義了一個代碼執行的環境。CLR執行一種稱為通用中間語言(Common Intermediate Language,簡稱CIL)的字節碼,這個是微軟的通用中間語言實現版本。

CLR的主要功能如下

  • 基類庫支持(Base Class Library Support)
  • 內存管理(Memory Management)
  • 線程管理(Thread Management)
  • 垃圾回收(Garbage Collection)
  • 安全性(Security)
  • 類型檢查(Type Checker)
  • 異常管理(Exception Manager)
  • 調試管理(Debug Engine)
  • 中間碼(MSIL)到機器代碼(Native)編譯
  • 類別裝載(Class Loader)

開發人員使用高級編程語言撰寫程序。接下來編譯器將代碼編譯成微軟的中繼語言(MSIL)。執行的時候CLR會將MSIL碼轉換為操作系統的原生碼(Native Code)。CLR內置有"即時編譯(Just-in-time compilation)"編譯器。

檢測已安裝.Net Framework版本

檢測工具介紹

用戶可在他們的計算機上安裝和運行.NET Framework的多個版本。當你開發或部署應用時,你可能需要知道用戶的計算機上安裝了哪些.NET Framework版本。注冊表包含計算機上安裝的.NET Framework版本列表。

.NET Framework由兩個采用不同版本的主要組件構成:

  • 一組程序集,它們是為應用提供功能的類型與資源的集合。.NET Framework和程序集使用相同的版本號。例如,.NET Framework版本包括4.5、4.6.1和4.7.2。
  • 公共語言運行時(CLR),可管理並執行應用代碼。單個CLR版本通常可支持多個.NET Framework版本。例如,CLR版本4.0.30319.xxxxx(其中xxxxx小於42000)支持.NET Framework版本4到4.5.2。大於或等於4.0.30319.42000的CLR版本支持從.NET Framework 4.6開始的.NET Framework版本。

可使用社區維護的工具幫助檢測安裝了哪些.NET Framework版本:

使用DotNetVersions檢測

解壓后,直接運行DotNetVersions.exe程序即可。

image

它會通過終端命令行彈出界面來顯示出打印結果,我們便可知道當前系統中已經安裝哪些版本了。

image

使用DotNetVersionLister檢測

通過命令行可以直接安裝它。

Install-Module -Name DotNetVersionLister -Scope CurrentUser #-Force

image

安裝后,調用命令行來使用它。

Get-STDotNetVersion

image

或者檢測遠程計算機的版本

Get-STDotNetVersion -ComputerName $RemoteServerName

通過注冊表位置來確認已安裝版本

通過Win + R組合來運行regedit,可進入注冊表編輯器,輸入如下路徑,可以查看到所有.Net framework版本的注冊表信息。

計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP

image

通過v4\Full路徑下子項中Release的值確定已安裝的版本,注冊表值和.Net framework版本對應關系如下:

.Net Framework版本 Release值
.NET Framework 4.5 所有Windows 8操作系統: 378389
.NET Framework 4.5.1 Windows 8.1Windows Server 2012 R2上:378675
在所有其他Windows 操作系統上:378758
.NET Framework 4.5.2 所有Windows 操作系統:379893
.NET Framework 4.6 Windows 10 1507上:393295
在所有其他Windows 操作系統上:393297
.NET Framework 4.6.1 Windows 10 11月更新(Windows 10 1511)系統上:394254
在所有其他Windows 操作系統(包括Windows 10)上:394271
.NET Framework 4.6.2 Windows 10 周年更新(Windows 10 1607)Windows Server 2016上:394802
在所有其他Windows 操作系統(包括其他Windows 10操作系統)上:394806
.NET Framework 4.7 Windows 10 創意者更新(Windows 10 1703)上:460798
在所有其他Windows 操作系統(包括其他Windows 10操作系統)上:460805
.NET Framework 4.7.1 Windows 10 秋季創意者更新(Windows 10 1709)Windows Server版本1709上:461308
在所有其他Windows 操作系統(包括其他Windows 10操作系統)上:461310
.NET Framework 4.7.2 Windows 10 2018年4月更新(Windows 10 1803)Windows Server版本1803上:461808
在除Windows 10 2018年4月更新和Windows Server版本1803之外的所有Windows 操作系統上:461814
.NET Framework 4.8 Windows 10 2019年5月更新(Windows 10 1903)Windows 10 2019年11月更新上:528040
Windows 10 2020年5月更新Windows 10 2020年10月更新Windows 10 2021年5月更新上:528372
Windows 11Windows Server 2022上:528449
在所有其他Windows 操作系統(包括其他Windows 10操作系統)上:528049

檢測已安裝CLR版本

可以通過clrver這個工具檢測本機已安裝的CLR版本,這個工具不需要單獨安裝,一般是隨Visual Studio安裝附帶了。

從開始菜單找到Developer Command Prompt for VS 2022入口,打開它,輸入如下命令即可:

clrver

image

如果要顯示當前計算機上的所有使用CLR的進程:

clrver -all

image

.Net Framework版本與CLR的關系

.NET框架是微軟公司繼Windows DNA之后的新開發平台。.NET框架是以一種采用系統虛擬機運行的編程平台,以通用語言運行庫(Common Language Runtime)為基礎,支持多種語言(C#、F#、VB.NET、C++、Python等)的開發。

image

2014年11月12日,微軟宣布將完全開放.NET框架的源代碼,並提供給Linux和macOS使用。

.Net Framework版本歷史

版本 公共語言執行時 發布時間 隨同分發於Visual Studio 預安裝於Windows 包含之前版本
客戶端版 服務器版
1.0 1.0 2002年2月13日 .NET 不適用 不適用 不適用
1.1 1.1 2003年4月24日 .NET 2003 不適用 2003
2.0 2.0 2005年11月7日 2005 不適用 2003 R2
3.0 2006年11月6日 不適用 Vista 不適用 2.0
3.5 3.5 2007年11月19日 2008 不適用 不適用 3.0 SP1 (2.0 SP1)
3.5.1 2008年2月4日 不適用 不適用 2008
3.5 SP1 2008年8月11日 2008 SP1 不適用 不適用 3.0 SP2 (2.0 SP2)
3.5.1 SP1 2009年7月22日 不適用 7 2008 R2
4 4.0 4.0 2010年4月12日 2010 不適用 不適用 不適用(置位更新)
4.5 2012年8月15日 2012 8 2012
4.5.1 2013年10月17日 2013 8.1 2012 R2
4.5.2 2014年5月5日 不適用 不適用 不適用
4.6 2015年7月20日 2015 10 不適用
4.6.1 2015年11月30日 2015 Update 1 10 v1511 不適用
4.6.2 2016年8月2日 不適用 10 v1607 2016
4.7 2017年4月5日 2017 v15.3 10 v1703 不適用
4.7.1 2017年10月17日 2017 v15.5 10 v1709 v1709
4.7.2 2018年4月30日 2019 10 v1803 v1803
4.8 2019年4月18日 不適用 10 v1909 v1909

針對.NET Framework的可再發行組件包和語言包

勤學實踐

https://github.com/TaylorShi/HelloDesktopAppConfig

創建解決方案HelloDesktopAppConfig

dotnet new sln -o HelloDesktopAppConfig
cd .\HelloDesktopAppConfig\
explorer.exe .

image

創建.Net framework項目demoForNetFramework2

image

選擇C#語言-Windows平台-桌面類型,選中Windows窗體應用模板,創建名為demoForNetFramework2的項目。

image

image

這里框架選定:.Net framework 2.0

image

創建.Net framework項目demoForNetFramework3

選擇C#語言-Windows平台-桌面類型,選中Windows窗體應用模板,創建名為demoForNetFramework3的項目。

image

這里框架選定:.Net framework 3.5

創建.Net framework項目demoForNetFramework4

選擇C#語言-Windows平台-桌面類型,選中Windows窗體應用模板,創建名為demoForNetFramework4的項目。

image

這里框架選定:.Net framework 4

創建.Net framework項目demoForNetFramework4.5

選擇C#語言-Windows平台-桌面類型,選中Windows窗體應用模板,創建名為demoForNetFramework45的項目。

image

這里框架選定:.Net framework 4.5

image

我們發現,在demoForNetFramework45項目中會比之前多出來一個App.config配置文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

創建.Net framework項目demoForNetFramework4.8

選擇C#語言-Windows平台-桌面類型,選中Windows窗體應用模板,創建名為demoForNetFramework48的項目。

image

這里框架選定:.Net framework 4.8

我們發現,在demoForNetFramework48項目中會比之前多出來一個App.config配置文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>
</configuration>

查看已有的應用配置文件

從上訴創建結果來看,從.Net framework 4.5的項目模板開始,Visual Studio就已經內置並在創建項目的時候,添加了應用配置文件App.config,雖然這里它叫App.config,但是你會發現編譯生成后的對應的文件不叫這個,而是和exe同名的一個config文件,比如編譯后得到的程序是demoForNetFramework48.exe,那么得到的配置文件實際上最終名稱和它一一對應,叫做demoForNetFramework48.exe.config,我們查看Bin下面的文件,這印證了這個說法。

image

image

補充新建應用配置文件

對於較老版本的.Net framework項目而言,創建之后並沒有攜帶應用配置文件,那么我們可以自己來創建一個,在項目上右鍵-添加-新建項

image

在左側切換到常規-應用程序配置文件,點擊添加即可。

image

image

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
</configuration>

默認得到的是個幾乎空白沒有意義的XML文件,這時候需要我們自己根據需要填充。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="version"/>
  </startup>
</configuration>

其中Version版本字段,指定與你的應用程序支持的.NET Framework版本匹配的CLR版本。使用以下字符串:

  • .NET Framework 1.0:v1.0.3705
  • .NET Framework 1.1:v1.1.4322
  • .NET Framework 2.0、3.0和3.5:v2.0.50727
  • .NET Framework 4及更高版本:v4.0

並且我們可以通過多組SupportedRuntime節點來指定對多個.NET Framework版本的支持。

注意書寫時需要按優先級順序寫出,優先級高的放置在前面。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0"/>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
</configuration>

關於SupportedRuntime的組合與安裝了不同版本.Net framework運行時計算機的對應情況

App.config文件設置 在安裝了3.5版的計算機上 在安裝了版本3.5和4或更高版本的計算機上 在安裝了版本4或更高版本的計算機上
None 在3.5上運行 在3.5上運行 顯示提示用戶安裝正確版本的錯誤消息
<supportedRuntimeversion="v2.0.50727"/> 在3.5上運行 在3.5上運行 顯示提示用戶安裝正確版本的錯誤消息
<supportedRuntimeversion="v2.0.50727"/><supportedRuntimeversion="v4.0"/> 在3.5上運行 在3.5上運行 在4或更高版本上運行
<supportedRuntimeversion="v4.0"/><supportedRuntimeversion="v2.0.50727"/> 在3.5上運行 在4或更高版本上運行 在4或更高版本上運行
<supportedRuntimeversion="v4.0"/> 顯示提示用戶安裝正確版本的錯誤消息 在4或更高版本上運行 在4或更高版本上運行

允許混合模式程序集加載到更高版本.Net framework

雖然我們可以通過SupportedRuntime的組合來實現程序對已安裝.Net framework版本的靈活選擇,但是默認情況下,想要在僅安裝.Net framework v4.0及其以上版本環境中繼續使用.Net 3.5或者.Net 2.0的程序集是不被允許的。

如需允許.Net framework v4.0及其以上版本運行較低.Net framework版本(如v2.0、v3.5)的程序集,那么可以通過設置Startup節點的useLegacyV2RuntimeActivationPolicy屬性值為true,來實現運行的兼容,這意味着在僅有v4.0+的計算機上仍然可以支持較低版本應用程序的運行。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
</configuration>

這對由較低.Net framework版本構建的.Net桌面應用程序實現向前兼容運行非常有用。

總結來說:SupportedRuntime節點組,主要是幫助程序在同時安裝了多個.Net framework(比如3.5&4.0)的版本的計算機環境中去擇選更優的運行時版本,而UseLegacyV2RuntimeActivationPolicy設置成true,可以讓較低.Net framework(比如2.0/3.5)版本構建的桌面程序在僅安裝了較高.Net framework(比如4.0/4.5/4.8)版本的計算機環境中兼容運行。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM