Dot-Net

何時以及為什麼需要supportedRuntime 元素和sku 屬性?

  • April 4, 2019

在 Visual Studio 中創建的大多數(如果不是全部)C#(以及 F# 和 VB)庫和可執行項目中,都有一個自動添加的app.config文件,用於指定執行時版本和目標框架名字對象 (TFM):

<configuration>
 <startup>
   <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
. . .

即使app.config完全沒有該文件,編譯器似乎總是生成一個程序集級屬性,如 ILDASM 所示:

.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01    // ....NETFramework
                                                                                                     ..    // ,Version=v4.6.1.
                                                                                     bytes snipped-> ..    // .T..FrameworkDis
                                                                                                     ..    // playName..NET Fr
                                                                                                     61  ) // amework 4.6.1

.csproj文件確實指定了目標框架,我猜這是在建構期間將目標傳遞給編譯器的地方。

<startup>如果沒有配置文件中的部分,執行檔似乎執行得很好。文件解釋屬性的含義,但是,多年來看到它們,我一直不明白為什麼在配置文件中需要它們。然而,我主要處理 Windows 的桌面應用程序。

這個答案明確指出“使編譯為目標 .NET 4.0 的程序表現得像在更高版本上執行是不可能的”,相反,如果在較低版本的框架上執行程序也是如此,我會感到非常驚訝。可能的。

那麼,在什麼場景下,應用程序開發者需要在應用程序的.config文件中指定執行時的版本和 TFM,是否必須總是複制編譯器硬編碼到二進製文件中的資訊?乍一看,這個要求似乎違反直覺。


更新 2018-06-29:X-ref:我要求澄清 GitHub 問題dotnet/docs#6234中的文件。

需要聲明您的應用程序實際上與哪些框架版本兼容。假設我們有一個以 .NET Framework 4.7.2 為目標的應用程序,並嘗試在僅安裝了 .NET Framework 4.5 的機器上執行它。如果我們添加這個 app.config

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

Windows 將顯示一個很好的錯誤消息,要求安裝所需的框架版本:

錯誤資訊

如果我們省略 app.config,Windows 將嘗試執行它,然後應用程序將在第一次遇到特定於 .NET Framework 4.7.2 的功能時崩潰,並且在已安裝的框架版本中不存在。

請注意,文件中說“所有使用 .NET Framework 1.1 或更高版本建構的應用程序都應使用此元素”的說法具有誤導性。它可能被解釋為“應用程序在 .NET 1.1+ 上執行需要此元素”,而實際上它僅意味著 .NET 1.1 更改了以前在 .NET 1.0語法中使用的requiredRuntime語法。更多時候supportedRuntime,應用程序不需要執行,它只是為了漂亮。

真正需要執行應用程序的一種常見情況supportedRuntime是,當我們有面向 .NET 2.x-3.x 的應用程序並嘗試在只有 4.x 的機器上執行它(例如,Windows 10 有 4.6+ 但確實預設情況下未安裝 .NET 2.x-3.x)。在這種情況下,如果沒有app.config,應用程序將根本無法執行,即使 4.x 大部分與以前的版本兼容。添加將解決問題。supportedRuntime``<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />


因此,總而言之,它不會復製程序集元數據中的資訊,而是為 Windows 提供有關如何將應用程序與其兼容的框架版本連接的附加資訊,以及如果目標電腦上不存在該版本要求使用者安裝什麼版本.

引用自:https://stackoverflow.com/questions/47298916