리소스 매니페스트 파일의 이름을 지정하는 방법

MSBuild에서 .NET Core 프로젝트를 컴파일할 때 파일 확장명이 .resx인 XML 리소스 파일이 이진 .resources 파일로 변환됩니다. 해당 이진 파일은 컴파일러의 출력에 포함되며 ResourceManager에서 읽을 수 있습니다. 이 문서에서는 MSBuild에서 각 .resources 파일의 이름을 선택하는 방법을 설명합니다.

프로젝트 파일에 리소스 항목을 명시적으로 추가하고 해당 항목이 .NET Core용 기본 포함 GLOB에도 포함되는 경우 빌드 오류가 발생합니다. 수동으로 리소스 파일을 EmbeddedResource 항목으로 포함하려면 EnableDefaultEmbeddedResourceItems 속성을 false로 설정합니다.

기본 이름

.NET Core 3.0 이상에서는 다음 조건을 모두 충족하는 경우 리소스 매니페스트의 기본 이름이 사용됩니다.

  • 리소스 파일이 LogicalName, ManifestResourceName 또는 DependentUpon 메타데이터를 사용하여 EmbeddedResource 항목으로 프로젝트 파일에 명시적으로 포함되어 있지 않습니다.
  • 프로젝트 파일에서 EmbeddedResourceUseDependentUponConvention 속성이 false로 설정되어 있지 않습니다. 기본적으로 이 속성은 true로 설정됩니다. 자세한 내용은 EmbeddedResourceUseDependentUponConvention을 참조하세요.

리소스 파일이 동일한 루트 파일 이름의 소스 파일(.cs 또는 .vb)과 함께 배치된 경우 소스 파일에 정의된 첫 번째 형식의 전체 이름이 매니페스트 파일 이름으로 사용됩니다. 예를 들어 MyNamespace.Form1Form1.cs에 정의된 첫 번째 형식이고 Form1.csForm1.resx와 함께 배치된 경우 해당 리소스 파일의 생성된 매니페스트 이름은 MyNamespace.Form1.resources입니다.

LogicalName 메타데이터

리소스 파일이 프로젝트 파일에 LogicalName 메타데이터를 사용하여 EmbeddedResource 항목으로 명시적으로 포함된 경우 LogicalName 값이 매니페스트 이름으로 사용됩니다. LogicalName이 다른 메타데이터나 설정보다 우선 적용됩니다.

예를 들어 다음 프로젝트 파일 조각에 정의된 리소스 파일의 매니페스트 이름은 SomeName.resources입니다.

<EmbeddedResource Include="X.resx" LogicalName="SomeName.resources" />

또는

<EmbeddedResource Include="X.fr-FR.resx" LogicalName="SomeName.resources" />

참고 항목

  • LogicalName이 지정되지 않으면 파일 이름에 두 개의 점(.)이 있는 EmbeddedResource가 작동하지 않습니다. 즉, GetManifestResourceNames가 해당 파일을 반환하지 않습니다.

    다음 메서드는 제대로 작동합니다.

    <EmbeddedResource Include="X.resx" />
    

    다음 예제는 제대로 작동하지 않습니다.

    <EmbeddedResource Include="X.fr-FR.resx" />
    

ManifestResourceName 메타데이터

리소스 파일이 프로젝트 파일에 ManifestResourceName 메타데이터(LogicalName은 없음)를 사용하여 EmbeddedResource 항목으로 명시적으로 포함된 경우 ManifestResourceName 값이 파일 확장명 .resources와 함께 매니페스트 파일 이름으로 사용됩니다.

예를 들어 다음 프로젝트 파일 조각에 정의된 리소스 파일의 매니페스트 이름은 SomeName.resources입니다.

<EmbeddedResource Include="X.resx" ManifestResourceName="SomeName" />

다음 프로젝트 파일 코드 조각에 정의된 리소스 파일의 매니페스트 이름은 SomeName.fr-FR.resources입니다.

<EmbeddedResource Include="X.fr-FR.resx" ManifestResourceName="SomeName.fr-FR" />

DependentUpon 메타데이터

리소스 파일이 프로젝트 파일에 DependentUpon 메타데이터(LogicalNameManifestResourceName은 없음)를 사용하여 EmbeddedResource 항목으로 명시적으로 포함된 경우 DependentUpon에 정의된 소스 파일의 정보가 리소스 매니페스트 파일 이름에 사용됩니다. 특히 소스 파일에 정의된 첫 번째 형식의 이름이 다음과 같이 매니페스트 이름에 사용됩니다. Namespace.Classname[.Culture].resources

예를 들어 다음 프로젝트 파일 조각에 정의된 리소스 파일의 매니페스트 이름은 Namespace.Classname.resources입니다. 여기서 Namespace.ClassnameMyTypes.cs에 정의된 첫 번째 클래스입니다.

<EmbeddedResource Include="X.resx" DependentUpon="MyTypes.cs">

다음 프로젝트 파일 조각에 정의된 리소스 파일의 매니페스트 이름은 입니다. 여기서 Namespace.ClassnameMyTypes.cs에 정의된 첫 번째 클래스입니다.

<EmbeddedResource Include="X.fr-FR.resx" DependentUpon="MyTypes.cs">

EmbeddedResourceUseDependentUponConvention 속성

프로젝트 파일에서 EmbeddedResourceUseDependentUponConventionfalse로 설정된 경우 각 리소스 매니페스트 파일 이름은 프로젝트의 루트 네임스페이스와 프로젝트 루트에서 .resx 파일까지의 상대 경로를 기반으로 합니다. 더 구체적으로 생성된 리소스 매니페스트 파일 이름은 RootNamespace.RelativePathWithDotsForSlashes.[Culture.]resources입니다. 같은 논리가 3.0 이전 버전의 .NET Core에서 매니페스트 이름을 생성하는 데에도 사용됩니다.

참고 항목

  • RootNamespace은 정의되지 않은 경우 기본적으로 프로젝트 이름으로 설정됩니다.
  • 프로젝트 파일의 EmbeddedResource 항목에 대해 LogicalName, ManifestResourceName 또는 DependentUpon 메타데이터가 지정된 경우 해당 리소스 파일에는 이 명명 규칙이 적용되지 않습니다.

참고 항목