development

자동으로 추가 된 supportedRuntime 요소를 제거하면 어떻게됩니까?

big-blog 2020. 11. 28. 09:43
반응형

자동으로 추가 된 supportedRuntime 요소를 제거하면 어떻게됩니까?


내 프로젝트 목표 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 만있는 컴퓨터에서 실행합니까?


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가 필요하다는 사실이 포함되어 있으며 설치하라는 메시지도 표시됩니다.

따라서 config 항목은 컴퓨터에 .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를 필요가 없습니다, 다음, 당신의 인생은 훨씬 간단합니다 : 단지 프로젝트 속성의 빌드 탭 및 대상 .NET 4.0로 이동합니다. 그런 다음 컴파일러는 4.0에 존재하지 않는 API를 호출하지 않고 앱이 .NET 4.0 및 .NET 4.5 시스템에서 성공적으로 실행되도록합니다.


@Dai 주석에 응답하고 Windows 서비스로 실행할 때 App.config 파일에 지정된 버전을 설치하라는 메시지가 표시되지 않을 수 있다는 사실도 설명합니다.

제거하는 방법이 있지만 .NET 4.0 vs 4.5 버전 체크인 코드를 안정적으로 시행합니까?

.NET 버전 4.5가 현재 코드를 실행하고 있음을 런타임에 어떻게 감지합니까? 에서 영감을 얻은 현재 프로그램이 주어진 .NET Framework 버전에서 실행되고 있는지 확인하기 위해 사용하는 방법은 다음과 같습니다 .

/// <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);

참고 URL : https://stackoverflow.com/questions/21566528/what-happens-if-i-remove-the-auto-added-supportedruntime-element

반응형