背景
托管公共語言運行時(CLR)的所有應用程序都必須啟動(或激活)CLR,才能運行托管代碼。通常,.NET Framework應用在生成它的CLR版本上運行,但你可以使用應用程序配置文件(有時稱為app.config文件)來更改桌面應用程序的此行為。
如果CLR激活系統無法加載應用程序所需運行時的正確版本,它將向用戶顯示一條錯誤消息,通知他們,他們的計算機未正確配置,無法運行該應用程序,並為他們提供機會來修復該問題。在此情況下通常會顯示以下錯誤消息。用戶可以選擇“是”以轉到Microsoft網站,從中為應用程序下載正確的.NETFramework版本。
若要解決根本問題並提供最佳用戶體驗(更少錯誤消息),建議執行以下操作:
- 對於.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。
安裝.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
通用語言執行平台(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版本:
- .NET Framework 2.0命令行工具 https://github.com/jmalarcon/DotNetVersions
- PowerShell 2.0模塊 https://github.com/EliteLoser/DotNetVersionLister
使用DotNetVersions檢測
解壓后,直接運行DotNetVersions.exe
程序即可。
它會通過終端命令行彈出界面來顯示出打印結果,我們便可知道當前系統中已經安裝哪些版本了。
使用DotNetVersionLister檢測
通過命令行可以直接安裝它。
Install-Module -Name DotNetVersionLister -Scope CurrentUser #-Force
安裝后,調用命令行來使用它。
Get-STDotNetVersion
或者檢測遠程計算機的版本
Get-STDotNetVersion -ComputerName $RemoteServerName
通過注冊表位置來確認已安裝版本
通過Win
+ R
組合來運行regedit
,可進入注冊表編輯器,輸入如下路徑,可以查看到所有.Net framework版本的注冊表信息。
計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP
通過v4\Full
路徑下子項中Release
的值確定已安裝的版本,注冊表值和.Net framework版本對應關系如下:
.Net Framework版本 | Release值 |
---|---|
.NET Framework 4.5 | 所有Windows 8 操作系統: 378389 |
.NET Framework 4.5.1 | 在Windows 8.1 和Windows 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 11 和Windows Server 2022 上:528449 在所有其他Windows 操作系統(包括其他Windows 10操作系統)上: 528049 |
檢測已安裝CLR版本
可以通過clrver
這個工具檢測本機已安裝的CLR版本,這個工具不需要單獨安裝,一般是隨Visual Studio安裝附帶了。
從開始菜單找到Developer Command Prompt for VS 2022
入口,打開它,輸入如下命令即可:
clrver
如果要顯示當前計算機上的所有使用CLR的進程:
clrver -all
.Net Framework版本與CLR的關系
.NET框架是微軟公司繼Windows DNA之后的新開發平台。.NET框架是以一種采用系統虛擬機運行的編程平台,以通用語言運行庫(Common Language Runtime)為基礎,支持多種語言(C#、F#、VB.NET、C++、Python等)的開發。
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的可再發行組件包和語言包
- .NET Framework 4.8
- .NET Framework 4.7.2
- .NET Framework 4.7.1
- .NET Framework 4.7
- .NET Framework 4.6.2
- .NET Framework 4.6.1
- .NET Framework 4.6
- .NET Framework 4.5.2
- .NET Framework 4.5.1
- .NET Framework 4.5
- .NET Framework 4.0
- .NET Framework 3.5 SP1
勤學實踐
創建解決方案HelloDesktopAppConfig
dotnet new sln -o HelloDesktopAppConfig
cd .\HelloDesktopAppConfig\
explorer.exe .
創建.Net framework項目demoForNetFramework2
選擇C#語言
-Windows
平台-桌面
類型,選中Windows窗體應用
模板,創建名為demoForNetFramework2
的項目。
這里框架選定:.Net framework 2.0
創建.Net framework項目demoForNetFramework3
選擇C#語言
-Windows
平台-桌面
類型,選中Windows窗體應用
模板,創建名為demoForNetFramework3
的項目。
這里框架選定:.Net framework 3.5
創建.Net framework項目demoForNetFramework4
選擇C#語言
-Windows
平台-桌面
類型,選中Windows窗體應用
模板,創建名為demoForNetFramework4
的項目。
這里框架選定:.Net framework 4
創建.Net framework項目demoForNetFramework4.5
選擇C#語言
-Windows
平台-桌面
類型,選中Windows窗體應用
模板,創建名為demoForNetFramework45
的項目。
這里框架選定:.Net framework 4.5
我們發現,在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
的項目。
這里框架選定:.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下面的文件,這印證了這個說法。
補充新建應用配置文件
對於較老版本的.Net framework
項目而言,創建之后並沒有攜帶應用配置文件,那么我們可以自己來創建一個,在項目上右鍵-添加-新建項。
在左側切換到常規-應用程序配置文件,點擊添加即可。
<?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)版本的計算機環境中兼容運行。
參考
- 公共語言運行時 (CLR) 概述
- .NET Framework 版本和依賴關系
- .NET Framework 概述
- .NET Framework應用的版本兼容性
- 如何:將應用配置為支持 .NET Framework 4 或更高版本
- .NET Framework 初始化錯誤:管理用戶體驗
- .NET Framework 部署指南(針對開發人員)
- 啟動設置架構
- 啟用useLegacyV2RuntimeActivationPolicy的影響?
- .net 4.5兼容4.0?
- 【回答】:Microsoft .NET Framework 各個版本之間的關系?如何安裝2.0,3.0,4.0?向下兼容?
- [VS2010].NET4.0環境下使用.NET2.0程序集,出現“混合模式程序集異常”
- 為什么使用useLegacyV2RuntimeActivationPolicy?
- 釐清 CLR、.NET、C#、Visual Studio、ASP.NET 各版本之間的關係
- Microsoft Developer Blogs
- What is the difference between .NET Framework and CLR Version
- .NET Framework version history
- .NET Framework For Version
- Microsoft .NET Framework 以及 CLR 的版本
- Installation C# application without dot net framework
- .NET Versioning and Multi-Targeting - .NET 4.5 is an in-place upgrade to .NET 4.0
- .NET Framework版本與CLR版本之間的關系
- Does the .Net Framework 4.0 Installer include the .Net Framework 3.5?
- Running .NET 3.5 apps on .NET 4 only systems
- 即時編譯
- DotNetVersionLister
- DotNetVersions
- HTML cleanup tool
- .NET框架
- 適用於程序集加載的最佳做法
- 各個版本Windows系統中自帶的.NET Framework版本
- Clrver.exe(CLR 版本工具)