다음을 통해 공유


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

이 페이지에는 다음과 같은 주요 변경 사항이 설명되어 있습니다.

주요 변경 내용 도입된 버전
디자인 타임 빌드는 최상위 패키지 참조만 반환 3.1
리소스 매니페스트 파일 이름 변경 3.0
이제 프로젝트 도구가 SDK에 포함됨 2.1

.NET Core 3.1

디자인 타임 빌드는 최상위 패키지 참조만 반환

.NET Core SDK 3.1.400부터 RunResolvePackageDependencies 대상에서는 최상위 패키지 참조만 반환합니다.

도입된 버전

.NET Core SDK 3.1.400

변경 내용 설명

이전 버전의 .NET Core SDK에서는 RunResolvePackageDependencies 대상이 NuGet 자산 파일의 정보를 포함하는 다음 MSBuild 항목을 만들었습니다.

  • PackageDefinitions
  • PackageDependencies
  • TargetDefinitions
  • FileDefinitions
  • FileDependencies

이 데이터는 Visual Studio에서 솔루션 탐색기의 종속성 노드를 채우는 데 사용됩니다. 그러나 데이터양이 많을 수 있고 종속성 노드를 확장하지 않는 경우 해당 데이터가 필요하지 않습니다.

.NET Core SDK 버전 3.1.400부터 이러한 항목은 대부분 기본적으로 생성되지 않습니다. Package 형식의 항목만 반환됩니다. Visual Studio에서 종속성 노드를 채울 항목이 필요한 경우 자산 파일에서 직접 정보를 읽습니다.

변경 이유

이 변경 사항은 Visual Studio 내에서 솔루션 로드 성능을 개선하기 위해 도입되었습니다. 이전에는 모든 패키지 참조를 로드했고 따라서 대부분의 사용자가 보지 않는 많은 참조가 로드되었습니다.

이러한 항목을 사용하는 MSBuild 논리를 만드는 경우 프로젝트 파일에서 EmitLegacyAssetsFileItems 속성을 true로 설정합니다. 이렇게 설정하면 모든 항목이 만들어지는 이전 동작이 사용됩니다.

범주

MSBuild

영향을 받는 API

해당 없음


.NET Core 3.0

리소스 매니페스트 파일 이름 변경

.NET Core 3.0부터 기본 사례에서 MSBuild는 리소스 파일에 대해 다른 매니페스트 파일 이름을 생성합니다.

도입된 버전

3.0

변경 내용 설명

.NET Core 3.0보다 이전 버전에서는 프로젝트 파일의 EmbeddedResource 항목에 대해 LogicalName, ManifestResourceName 또는 DependentUpon 메타데이터가 지정되지 않은 경우 MSBuild는 <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources 패턴으로 매니페스트 파일 이름을 생성했습니다. 프로젝트 파일에 RootNamespace가 정의되어 있지 않은 경우 기본적으로 프로젝트 이름으로 설정됩니다. 예를 들어, 루트 프로젝트 디렉터리의 Form1.resx라는 리소스 파일에 대해 생성된 매니페스트 이름은 MyProject.Form1.resources였습니다.

.NET Core 3.0부터 리소스 파일이 동일한 이름의 소스 파일과 공동 배치되는 경우(예: Form1.resxForm1.cs) MSBuild는 소스 파일의 형식 정보를 사용하여 <Namespace>.<ClassName>.resources 패턴으로 매니페스트 파일 이름을 생성합니다. 네임스페이스 및 클래스 이름은 공동 배치된 소스 파일의 첫 번째 형식에서 추출됩니다. 예를 들어 Form1.cs라는 소스 파일과 공동 배치된 Form1.resx라는 리소스 파일에 대해 생성된 매니페스트 이름은 MyNamespace.Form1.resources입니다. 중요한 점은 파일 이름의 첫 부분이 이전 버전의 .NET Core와 다르다는 것입니다(MyProject가 아니라 MyNamespace).

참고 항목

프로젝트 파일의 EmbeddedResource 항목에 LogicalName, ManifestResourceName 또는 DependentUpon 메타데이터가 지정되어 있는 경우 이 변경 내용은 해당 리소스 파일에 영향을 주지 않습니다.

이 주요 변경 내용은 .NET Core 프로젝트에 EmbeddedResourceUseDependentUponConvention 속성을 추가하여 도입되었습니다. 기본적으로 리소스 파일은 .NET Core 프로젝트 파일에 명시적으로 나열되지 않으므로 생성된 .resources 파일의 이름을 지정하는 방법을 지정하는 DependentUpon 메타데이터가 없습니다. EmbeddedResourceUseDependentUponConvention이 기본값 true로 설정된 경우 MSBuild는 공동 배치된 소스 파일을 찾아 해당 파일에서 네임스페이스 및 클래스 이름을 추출합니다. EmbeddedResourceUseDependentUponConventionfalse로 설정하면 MSBuild는 이전 동작에 따라, 즉 RootNamespace와 상대 파일 경로를 결합하여 매니페스트 이름을 생성합니다.

대부분의 경우 개발자에게는 아무 작업도 필요하지 않으며 앱은 계속 작동할 것입니다. 그러나 이 변경으로 앱이 중단되는 경우 다음 중 하나를 수행할 수 있습니다.

  • 새 매니페스트 이름을 예상하도록 코드를 변경합니다.

  • 프로젝트 파일에서 EmbeddedResourceUseDependentUponConventionfalse로 설정하여 새 명명 규칙을 옵트아웃합니다.

    <PropertyGroup>
      <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
    </PropertyGroup>
    

범주

MSBuild

영향을 받는 API

해당 없음


.NET Core 2.1

이제 프로젝트 도구가 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

N/A