다음을 통해 공유


.NET Core 2.1의 호환성이 손상되는 변경

.NET Core 버전 2.1로 마이그레이션하는 경우 이 문서에 나열된 호환성이 손상되는 변경이 앱에 영향을 줄 수 있습니다.

핵심 .NET 라이브러리

경로 API가 잘못된 문자에 대해 예외를 throw하지 않음

파일 경로와 관련된 API는 잘못된 문자가 발견된 경우 더 이상 경로 문자의 유효성을 검사하거나 ArgumentException을 throw하지 않습니다.

변경 내용 설명

.NET Framework 및 .NET Core 1.0~2.0에서는 경로 인수에 잘못된 경로 문자가 포함된 경우 영향을 받는 API 섹션에 나열된 메서드가 ArgumentException을 throw합니다. .NET Core 2.1부터 잘못된 문자가 발견된 경우 이 메서드는 더 이상 잘못된 경로 문자를 검사하거나 예외를 throw하지 않습니다.

변경 이유

경로 문자의 적극적 유효성 검사는 일부 플랫폼 간 시나리오를 차단합니다. .NET에서 운영 체제 API 호출 결과를 복제하거나 예측하지 않도록 이 변경 내용이 도입되었습니다. 자세한 내용은 .NET Core 2.1의 System.IO 살펴보기 블로그 게시물을 참조하세요.

도입된 버전

.NET Core 2.1

코드가 이 API를 사용하여 잘못된 문자를 검사한 경우 Path.GetInvalidPathChars 호출을 추가할 수 있습니다.

영향을 받는 API

참고 항목


기본 제공 구조체 형식에 추가된 프라이빗 필드

프라이빗 필드가 참조 어셈블리특정 구조체 형식에 추가되었습니다. 그 결과 C#에서 이러한 구조체 형식은 항상 new 연산자 또는 기본 리터럴을 사용하여 인스턴스화해야 합니다.

변경 내용 설명

.NET Core 2.0 및 이전 버전에서 제공되는 일부 구조체 형식(예: ConsoleKeyInfo)은 C#에서 new 연산자 또는 기본 리터럴을 사용하지 않고도 인스턴스화할 수 있습니다. 이는 C# 컴파일러에서 사용하는 참조 어셈블리에 구조체에 대한 프라이빗 필드가 포함되지 않았기 때문입니다. .NET 구조체 형식에 대한 모든 프라이빗 필드는 .NET Core 2.1에서 시작하는 참조 어셈블리에 추가됩니다.

예를 들어 다음 C# 코드는 .NET Core 2.0에서 컴파일되지만 .NET Core 2.1에서는 컴파일되지 않습니다.

ConsoleKeyInfo key;    // Struct type

if (key.ToString() == "y")
{
    Console.WriteLine("Yes!");
}

.NET Core 2.1에서 이전 코드로 인해 CS0165 - 할당되지 않은 지역 변수 'key' 사용 컴파일러 오류가 발생합니다.

도입된 버전

2.1

new 연산자 또는 기본 리터럴을 사용하여 구조체 형식을 인스턴스화합니다.

예시:

ConsoleKeyInfo key = new ConsoleKeyInfo();    // Struct type.

if (key.ToString() == "y")
    Console.WriteLine("Yes!");
ConsoleKeyInfo key = default;    // Struct type.

if (key.ToString() == "y")
    Console.WriteLine("Yes!");

범주

핵심 .NET 라이브러리

영향을 받는 API


macOS의 OpenSSL 버전

macOS에서 .NET Core 3.0 이상 런타임은 이제 AesCcm, AesGcm, DSAOpenSsl, ECDiffieHellmanOpenSsl, ECDsaOpenSsl, RSAOpenSslSafeEvpPKeyHandle 형식에 대해 OpenSSL 1.0.x 버전보다 OpenSSL 1.1.x 버전을 선호합니다.

.NET Core 2.1 런타임은 이제 OpenSSL 1.1.x 버전을 지원하지만 여전히 OpenSSL 1.0.x 버전을 선호합니다.

변경 내용 설명

이전에는 .NET Core 런타임이 macOS에서 OpenSSL과 상호 작용하는 형식에 대해 OpenSSL 1.0.x 버전을 사용했습니다. 최신 OpenSSL 1.0.x 버전인 OpenSSL 1.0.2는 이제 지원되지 않습니다. 지원되는 버전의 OpenSSL에 대해 OpenSSL을 사용하는 형식을 유지하기 위해 .NET Core 3.0 이상 런타임이 이제 macOS에서 최신 버전의 OpenSSL을 사용합니다.

이러한 변경을 통해 macOS에서 .NET Core 런타임에 대한 동작은 다음과 같습니다.

  • .NET Core 3.0 이상 버전 런타임은 OpenSSL 1.1.x 버전(사용 가능한 경우)을 사용하고 사용 가능한 1.1.x 버전이 없는 경우에만 OpenSSL 1.0.x 버전으로 대체됩니다.

    사용자 지정 P/Invokes에 OpenSSL interop 형식을 사용하는 호출자의 경우 SafeEvpPKeyHandle.OpenSslVersion 설명의 지침을 따릅니다. OpenSslVersion 값을 확인하지 않으면 앱의 작동이 중단될 수도 있습니다.

  • .NET Core 2.1 런타임은 OpenSSL 1.0.x 버전(사용 가능한 경우)을 사용하고 사용 가능한 1.0.x 버전이 없는 경우 OpenSSL 1.1.x 버전으로 대체됩니다.

    .NET Core 2.1에 SafeEvpPKeyHandle.OpenSslVersion 속성이 없어 런타임에 신뢰성 있게 OpenSSL 버전을 확인할 수 없기 때문에 2.1 런타임은 이전 버전의 OpenSSL을 선호합니다.

도입된 버전

  • .NET Core 2.1.16
  • .NET Core 3.0.3
  • .NET Core 3.1.2

범주

핵심 .NET 라이브러리

영향을 받는 API


MSBuild

이제 프로젝트 도구가 SDK에 포함됨

이제 .NET Core 2.1 SDK에 일반적인 CLI 도구가 포함되며 더 이상 프로젝트에서 해당 도구를 참조할 필요가 없습니다.

변경 내용 설명

.NET Core 2.0에서 프로젝트는 <DotNetCliToolReference> 프로젝트 설정을 사용하여 외부 .NET 도구를 참조합니다. .NET Core 2.1에서 해당 도구 중 일부는 .NET Core SDK에 포함되며 더 이상 설정이 필요하지 않습니다. 프로젝트에 해당 도구에 대한 참조를 포함하는 경우 다음과 같은 오류가 표시됩니다. 'Microsoft.EntityFrameworkCore.Tools.DotNet' 도구는 이제 .NET Core SDK에 포함됩니다.

이제 도구가 .NET Core 2.1 SDK에 포함됨:

<DotNetCliToolReference> 값 도구
Microsoft.DotNet.Watcher.Tools dotnet-watch
Microsoft.Extensions.SecretManager.Tools dotnet-user-secrets
Microsoft.Extensions.Caching.SqlConfig.Tools dotnet-sql-cache
Microsoft.EntityFrameworkCore.Tools.DotNet dotnet-ef

도입된 버전

.NET Core SDK 2.1.300

프로젝트에서 <DotNetCliToolReference> 설정을 제거합니다.

범주

MSBuild

영향을 받는 API

해당 없음


참고 항목