如果我删除自动添加的supportedRuntime元素会怎样?

时间:2014-02-05 00:43:03

标签: .net

我的项目目标是4.0。 我将其更新为4.5并添加了VS

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

除了更改TargetFrameworkVersion之外,我很好奇这是多余的。 我的理解是,如果运行时没有找到supportedRuntime,它会使用用于构建exe的.net版本。所以在这种情况下,exe是使用4.5构建的,它也说使用4.5。无论我是否拥有此功能,它的行为都会有所不同,并在只有4.0的机器上运行它吗?

2 个答案:

答案 0 :(得分:79)

MSDN文档没有给出任何好的解释,但我发现Scott Hanselman撰写的一篇名为“.NET Versioning and Multi-Targeting - .NET 4.5 is an in-place upgrade to .NET 4.0”的博客文章揭示:

  

如果你正在制作一个客户端应用程序,如WinForms,Console,WPF等,这都是自动的。您的app.config包含您需要.NET 4.5的事实,您甚至会得到安装它的提示。

所以配置条目就是如果用户机器上的.NET 4.0(而不是.NET 4.5)尝试运行.NET 4.5应用程序时会发生什么。 .NET 4.0和.NET 4.5都是基于CLR的第4版构建的,因此它们在理论上是兼容的;相同的二进制格式和所有这些。针对.NET 4.0构建的二进制文件和针对.NET 4.5构建的二进制文件之间的唯一区别是它们引用的库。

因此,为.NET 4.5编译的应用程序可以在仅安装了.NET 4.0的计算机上运行。但是,如果您尝试使用4.0中不存在的任何API,它将获得运行时异常。

如果您有此配置文件条目且.NET 4.0用户尝试运行您的应用程序,则该应用程序将无法运行,系统将提示用户安装.NET 4.5。 (请参阅Scott博客文章中的截图。)对于大多数人来说,这是一个很好的默认设置。

如果您没有配置文件条目,那么使用.NET 4.0的用户将能够运行您的应用程序,但如果您尝试调用任何方法或使用4.5中添加的任何类型。对于您作为开发人员和测试人员而言,这将是一个巨大的痛苦。只有在特定要求的情况下才能执行此操作您的应用必须在.NET 4.0上运行必须利用新的4.5功能(如果它们存在)在两个版本上都要小心异常处理和测试。

如果您希望能够在.NET 4.0上运行,但不需要任何新的4.5 API 那么您的生活就会简单得多:只需转到Project Properties的Build选项卡,目标是.NET 4.0。然后编译器将确保您不调用4.0中不存在的任何API,并且您的应用程序将在.NET 4.0和.NET 4.5计算机上成功运行。

答案 1 :(得分:2)

回答@Dai注释,并解决以下事实:作为Windows服务运行时,可能不会提示您在App.config文件中安装指定的版本。

  

有什么方法可以删除它,但是可以可靠地在代码中强制执行.NET 4.0 vs 4.5版本检查?

这是我用来确保当前程序在给定的.NET Framework版本上运行的灵感,其灵感来自How do I detect at runtime that .NET version 4.5 is currently running your code?

/// <summary>
/// Throws an exception if the current version of the .NET Framework is smaller than the specified <see cref="supportedVersion"/>.
/// </summary>
/// <param name="supportedVersion">The minimum supported version of the .NET Framework on which the current program can run.
/// The version to use is not the marketing version, but the file version of mscorlib.dll.
/// See <see href="https://blogs.msdn.microsoft.com/dougste/2016/03/17/file-version-history-for-clr-4-x/">File version history for CLR 4.x</see> and/or <see href="https://it.wikipedia.org/wiki/.NET_Framework#Versioni">.NET Framework Versioni (Build pubblicata)</see> for the version to use.
/// </param>
/// <exception cref="NotSupportedException">The current version of the .NET Framework is smaller than the specified <see cref="supportedVersion"/>.</exception>
/// <returns>The version of the .NET Framework on which the current program is running.</returns>
public static Version EnsureSupportedDotNetFrameworkVersion(Version supportedVersion)
{
    var fileVersion = typeof(int).Assembly.GetCustomAttribute<AssemblyFileVersionAttribute>();
    var currentVersion = new Version(fileVersion.Version);
    if (currentVersion < supportedVersion)
        throw new NotSupportedException($"Microsoft .NET Framework {supportedVersion} or newer is required. Current version ({currentVersion}) is not supported.");
    return currentVersion;
}

确保在.NET 4.6.2上运行的示例用法:

var v462 = new Version(4, 6, 1590, 0);
EnsureSupportedDotNetFrameworkVersion(v462);