속성 페이지 XML 규칙 파일

IDE의 프로젝트 속성 페이지는 기본 규칙 폴더의 XML 파일에 의해 구성됩니다. XML 파일은 규칙의 이름, 범주 및 개별 속성, 데이터 형식, 기본값 및 표시 방법을 설명합니다. IDE에서 속성을 설정하면 새 값이 프로젝트 파일에 저장됩니다.

기본 규칙 폴더의 경로는 사용 중인 Visual Studio의 로캘 및 버전에 따라 달라집니다. Visual Studio 2015 이전 버전의 개발자 명령 프롬프트에서 규칙 폴더는 %ProgramFiles(x86)%\MSBuild\Microsoft.Cpp\v4.0\<version>\<locale>입니다. Visual Studio 2015에서 <version> 값은 v140입니다. <locale>은 LCID(예: 영어의 경우 1033)입니다. 설치된 각 Visual Studio 버전과 각각의 언어에 대해 다른 경로를 사용합니다. 예를 들어, Visual Studio 2015 Community 영어 버전의 기본 규칙 폴더 경로는 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140\1033\입니다.

기본 규칙 폴더의 경로는 사용 중인 Visual Studio의 로캘 및 버전에 따라 달라집니다. Visual Studio 2017 버전의 개발자 명령 프롬프트에서 규칙 폴더는 %VSINSTALLDIR%Common7\IDE\VC\VCTargets\<locale>\입니다. <locale>은 LCID(예: 영어의 경우 1033)입니다. Visual Studio 2015 이전 버전의 개발자 명령 프롬프트에서 규칙 폴더는 %ProgramFiles(x86)%\MSBuild\Microsoft.Cpp\v4.0\<version>\<locale>\입니다. 여기서 <version> 값은 Visual Studio 2015의 경우 v140입니다. 설치된 각 Visual Studio 버전과 각각의 언어에 대해 다른 경로를 사용합니다. 예를 들어, Visual Studio 2017 Community 영어 버전의 기본 규칙 폴더 경로는 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\1033\입니다.

기본 규칙 폴더의 경로는 사용 중인 Visual Studio의 로캘 및 버전에 따라 달라집니다. Visual Studio 2019 이상 버전의 개발자 명령 프롬프트에서 규칙 폴더는 %VSINSTALLDIR%MSBuild\Microsoft\VC\<version>\<locale>\입니다. 여기서 <version> 값은 Visual Studio 2019의 경우 v160입니다. <locale>은 LCID(예: 영어의 경우 1033)입니다. Visual Studio 2017에서 규칙 폴더는 %VSINSTALLDIR%Common7\IDE\VC\VCTargets\<locale>\입니다. Visual Studio 2015 이전 버전의 개발자 명령 프롬프트에서 규칙 폴더는 %ProgramFiles(x86)%\MSBuild\Microsoft.Cpp\v4.0\<version>\<locale>\입니다. 설치된 각 Visual Studio 버전과 각각의 언어에 대해 다른 경로를 사용합니다. 예를 들어, Visual Studio 2019 Community 영어 버전의 기본 규칙 폴더 경로는 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\1033\입니다.

다음 몇 가지 시나리오에서 이러한 파일 및 Visual Studio IDE의 내부 작업만 이해하면 됩니다.

  • 사용자 지정 속성 페이지를 만들거나
  • Visual Studio IDE를 사용하지 않고 프로젝트 속성을 사용자 지정하려고 합니다.

규칙 파일의 내용

먼저 프로젝트의 속성 페이지를 열어 보겠습니다. 솔루션 탐색기 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

Screenshot of the project Property Pages dialog.

구성 속성 아래의 각 노드를 규칙이라고 합니다. 규칙은 컴파일러와 같은 단일 도구를 나타내는 경우도 있습니다. 일반적으로 이 용어는 속성이 있고 실행되며 일부 출력을 생성할 수 있는 항목을 나타냅니다. 각 규칙은 기본 규칙 폴더의 XML 파일에서 채워집니다. 예를 들어 여기에 표시된 C/C++ 규칙은 으로 cl.xml채워집니다.

각 규칙에는 범주구성된 속성 집합이 있습니다. 규칙 아래의 각 하위 노드는 범주를 나타냅니다. 예를 들어 C/C++ 아래최적화 노드에는 컴파일러 도구의 모든 최적화 관련 속성이 포함됩니다. 속성 및 해당 값은 오른쪽 창의 그리드 형식으로 렌더링됩니다.

메모장이나 XML 편집기에서 열 cl.xml 수 있습니다. 라는 Rule루트 노드가 표시됩니다. 추가 메타데이터와 함께 UI에 표시되는 동일한 속성 목록을 정의합니다.

<?xml version="1.0" encoding="utf-8"?>
<!--Copyright, Microsoft Corporation, All rights reserved.-->
<Rule Name="CL" PageTemplate="tool" DisplayName="C/C++" SwitchPrefix="/" Order="10" xmlns="http://schemas.microsoft.com/build/2009/properties" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <Rule.Categories>
    <Category Name="General" DisplayName="General" />
    <Category Name="Optimization" DisplayName="Optimization" />
    <Category Name="Preprocessor" DisplayName="Preprocessor" />
    <Category Name="Code Generation" DisplayName="Code Generation" />
    <Category Name="Language" DisplayName="Language" />
    <Category Name="Precompiled Headers" DisplayName="Precompiled Headers" />
    <Category Name="Output Files" DisplayName="Output Files" />
    <Category Name="Browse Information" DisplayName="Browse Information" />
    <Category Name="Advanced" DisplayName="Advanced" />
    <Category Name="All Options" DisplayName="All Options" Subtype="Search" />
    <Category Name="Command Line" DisplayName="Command Line" Subtype="CommandLine" />
  </Rule.Categories>
  <!-- . . . -->
</Rule>

속성 페이지 UI의 구성 속성 아래에는 모든 노드에 대해 하나의 XML 파일이 있습니다. UI에서 규칙을 추가하거나 제거할 수 있습니다. 이 작업은 프로젝트의 해당 XML 파일에 위치를 포함하거나 제거하여 수행됩니다. 예를 들어 다음과 같은 방법이 Microsoft.CppBuild.targets 있습니다(1033 폴더보다 한 수준 더 높은 것으로 확인됨) cl.xml.

<PropertyPageSchema Condition="'$(ConfigurationType)' != 'Utility'" Include="$(VCTargetsPath)$(LangID)\cl.xml"/>

모든 데이터를 제거하는 cl.xml 경우 다음과 같은 기본 프레임워크가 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<Rule>
  <Rule.DataSource />
  <Rule.Categories>
    <Category />
    <!-- . . . -->
  </Rule.Categories>
  <BoolProperty />
  <EnumProperty />
  <IntProperty />
  <StringProperty />
  <StringListProperty />
</Rule>

다음 섹션에서는 각 주요 요소와 연결할 수 있는 일부 메타데이터에 대해 설명합니다.

규칙 특성

요소는 <Rule> XML 파일의 루트 노드입니다. 다음과 같은 많은 특성이 있을 수 있습니다.

<Rule Name="CL" PageTemplate="tool" SwitchPrefix="/" Order="10"
          xmlns="http://schemas.microsoft.com/build/2009/properties"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <Rule.DisplayName>
    <sys:String>C/C++</sys:String>
  </Rule.DisplayName>
  • Name: Name 특성은 .의 RuleID입니다. 프로젝트의 모든 속성 페이지 XML 파일에서 고유해야 합니다.

  • PageTemplate: 이 특성의 값은 UI 템플릿 컬렉션에서 선택하는 데 UI에서 사용됩니다. "tool" 템플릿은 속성을 표준 표 형식으로 렌더링합니다. 이 특성에 대한 다른 기본 제공 값은 "debugger" 및 "generic"입니다. 이러한 값을 지정하여 생성된 UI 형식을 보려면 각각 Debugging 노드 및 General 노드를 참조하세요. "디버거" 페이지 템플릿의 UI는 드롭다운 상자를 사용하여 다른 디버거의 속성 간에 전환합니다. "제네릭" 템플릿은 노드 아래에 여러 범주 하위 노드가 있는 것이 아니라 한 페이지에 서로 다른 속성 범주를 Rule 표시합니다. 이 특성은 UI에 대한 제안일 뿐입니다. XML 파일은 UI 독립적으로 설계되었습니다. 다른 UI는 이 특성을 다른 용도로 사용할 수 있습니다.

  • SwitchPrefix: 스위치의 명령줄에서 사용되는 접두사입니다. 값 "/" 이 있으면 스위치가 다음과 같이 /ZI/nologo/W3표시됩니다.

  • Order: 시스템의 다른 모든 규칙과 비교하여 해당 Rule 위치의 잠재 UI 클라이언트에 대한 제안입니다.

  • xmlns: 표준 XML 요소입니다. 나열된 세 개의 네임스페이스를 볼 수 있습니다. 이러한 특성은 각각 XML 역직렬화 클래스, XML 스키마 및 시스템 네임스페이스에 대한 네임스페이스에 해당합니다.

  • DisplayName: 노드의 속성 페이지 UI Rule 에 표시되는 이름입니다. 이 값은 지역화됩니다. 내부 지역화 도구 요구 사항 때문에 특성(예: 또는SwitchPrefix)이 아닌 자식 요소 Rule 로 만들었습니다DisplayName.Name XML 관점에서 볼 때 둘 다 동일합니다. 따라서 특성을 간단하게 표시하거나 그대로 둘 수 있습니다.

  • DataSource: 이 중요한 속성은 프로젝트 시스템에 속성 값을 읽고 쓸 위치와 해당 그룹화(나중에 설명)를 알려줍니다. 의 경우 cl.xml이러한 값은 다음과 같습니다.

    <DataSource Persistence="ProjectFile" ItemType="ClCompile" Label="" HasConfigurationCondition="true" />
    
    • Persistence="ProjectFile" 는 프로젝트 시스템에 속성 Rule 페이지를 생성하는 데 사용된 노드에 따라 프로젝트 파일 또는 속성 시트 파일에 모든 속성을 기록하도록 지시합니다. 다른 가능한 값은 "UserFile"파일에 값을 쓰는 값입니다 .user .

    • ItemType="ClCompile"은 이 항목 형식의 ItemDefinition 메타데이터 또는 항목 메타데이터 (후자는 속성 페이지가 솔루션 탐색기의 파일 노드에서 생성된 경우에만 해당)로 저장된다는 것을 나타냅니다. 이 필드가 설정되지 않은 경우 속성은 PropertyGroup에서 공용 속성으로 작성됩니다.

    • Label=""은 속성이 ItemDefinition 메타데이터로 작성될 때 부모 ItemDefinitionGroup의 레이블이 비어 있음을 나타냅니다(모든 MSBuild 요소에 레이블이 있을 수 있음). Visual Studio 2017 이상에서는 레이블이 지정된 그룹을 사용하여 .vcxproj 프로젝트 파일을 탐색합니다. 대부분의 Rule 속성을 포함하는 그룹에는 빈 문자열이 레이블로 있습니다.

    • HasConfigurationCondition="true"는 현재 프로젝트 구성에만 적용되도록(조건이 부모 그룹 또는 값 자체에 연결될 수 있도록) 프로젝트 시스템에 구성 조건을 값에 첨부하도록 지시합니다. 예를 들어 프로젝트 노드에서 속성 페이지를 열고 구성 속성 > C/C++ 일반에서 경고를 오류로 처리 속성의 값을 "예"로 설정합니다. 다음 값이 프로젝트 파일에 기록됩니다. 부모 ItemDefinitionGroup에 연결된 구성 조건을 확인합니다.

      <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
        <ClCompile>
          <TreatWarningAsError>true</TreatWarningAsError>
        </ClCompile>
      </ItemDefinitionGroup>
      

      이 값이 속성 페이지에서 특정 파일(예: ) stdafx.cpp에 설정된 경우 속성 값은 다음과 같이 프로젝트 파일의 stdafx.cpp 항목 아래에 기록되어야 합니다. 구성 조건이 메타데이터 자체에 직접 연결되는 방법을 확인합니다.

      <ItemGroup>
        <ClCompile Include="stdafx.cpp">
          <TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</TreatWarningAsError>
        </ClCompile>
      </ItemGroup>
      

    여기에 나열되지 않은 또 다른 특성 DataSource 은 다음과 같습니다 PersistedName. 이 특성을 사용하여 프로젝트 파일의 속성을 다른 이름으로 나타낼 수 있습니다. 기본적으로 이 특성은 속성의 Name.로 설정됩니다.

    개별 속성은 부모 Rule속성을 재정의할 DataSource 수 있습니다. 이 경우 해당 속성 값의 위치는 해당 속성의 다른 속성과 Rule다릅니다.

  • 여기에 표시되지 않는 특성(포함 DescriptionSupportsFileBatching)의 Rule다른 특성이 있습니다. 이러한 형식에 대한 설명서를 검색하여 다른 요소에 적용 Rule 할 수 있는 특성의 전체 집합을 가져올 수 있습니다. 또는 Microsoft.Build.Framework.dll 어셈블리의 Microsoft.Build.Framework.XamlTypes 네임스페이스에 있는 형식의 공용 속성을 살펴볼 수 있습니다.

  • DisplayNamePageTemplateOrder UI 독립적 데이터 모델에 있는 UI 관련 속성입니다. 이러한 속성은 속성 페이지를 표시하는 데 사용되는 모든 UI에서 거의 사용됩니다. DisplayNameDescription XML 파일의 거의 모든 요소에 있는 두 가지 속성입니다. 그리고 이 두 속성은 지역화된 유일한 속성입니다.

범주 요소

A Rule 에는 여러 Category 요소가 있을 수 있습니다. 범주가 XML 파일에 나열되는 순서는 범주를 동일한 순서로 표시하는 UI에 대한 제안입니다. 예를 들어 UI에 표시되는 C/C++ 노드 아래의 범주 순서는 순서와 cl.xml같습니다. 샘플 범주는 다음과 같습니다.

<Category Name="Optimization">
  <Category.DisplayName>
    <sys:String>Optimization</sys:String>
  </Category.DisplayName>
</Category>

이 코드 조각은 이전에 설명한 특성과 DisplayName 특성을 보여줍니다Name. 다시 한번, 예제에 표시되지 않는 다른 특성 Category 이 있을 수 있습니다. 설명서를 읽거나 다음을 사용하여 ildasm.exe어셈블리를 검사하여 해당 정보를 알아볼 수 있습니다.

속성 요소

대부분의 규칙 파일은 요소로 구성됩니다 Property . 에 있는 모든 속성 Rule목록이 포함됩니다. 각 속성은 기본 프레임워크BoolPropertyStringPropertyEnumPropertyIntPropertyStringListProperty에 표시된 5가지 가능한 형식 중 하나일 수 있습니다. 파일에 이러한 형식이 몇 가지 있을 수 있습니다. 속성에는 자세히 설명할 수 있는 여러 특성이 있습니다. 여기에 StringProperty 설명되어 있습니다. 나머지는 비슷합니다.

<StringProperty Subtype="file" Name="ObjectFileName" Category="Output Files" Switch="Fo">
  <StringProperty.DisplayName>
    <sys:String>Object File Name</sys:String>
  </StringProperty.DisplayName>
  <StringProperty.Description>
    <sys:String>Specifies a name to override the default object file name; can be file or directory name.(/Fo[name])</sys:String>
  </StringProperty.Description>
</StringProperty>

코드 조각에 있는 대부분의 특성은 이전에 설명되었습니다. 새 항목은 < a0 Subtype/ Category>입니다 Switch.

  • Subtype 는 요소에만 StringProperty 사용할 수 있는 특성입니다 StringListProperty . 컨텍스트 정보를 제공합니다. 예를 들어 값 file 은 속성이 파일 경로를 나타낸다는 것을 나타냅니다. Visual Studio는 이러한 컨텍스트 정보를 사용하여 편집 환경을 향상시킵니다. 예를 들어 사용자가 파일을 속성의 편집기로 시각적으로 선택할 수 있는 Windows 탐색기 창을 제공할 수 있습니다.

  • Category: 이 속성이 속하는 범주입니다. UI의 출력 파일 범주에서 이 속성을 찾아보세요.

  • Switch: 규칙이 컴파일러 도구와 같은 도구를 나타내는 경우 대부분의 Rule 속성은 빌드 시 도구 실행 파일에 스위치로 전달됩니다. 이 특성의 값은 사용할 스위치 리터럴을 나타냅니다. 이 예제에서는 <StringProperty> 스위치가 되도록 Fo지정합니다. 부모Rule에 있는 SwitchPrefix 특성과 결합된 이 속성은 실행 파일에 다음과 같이 /Fo"Debug\"전달됩니다. 속성 페이지 UI의 C/C++에 대한 명령줄에 표시됩니다.

    기타 속성 특성은 다음과 같습니다.

  • Visible: 속성 페이지에 속성을 표시하지 않고 빌드 시 사용할 수 있도록 하려면 이 특성을 false.로 설정합니다.

  • ReadOnly: 속성 페이지에서 이 속성 값의 읽기 전용 보기를 제공하려면 이 특성을 true.로 설정합니다.

  • IncludeInCommandLine: 빌드 시 도구에 일부 속성이 필요하지 않을 수 있습니다. 특정 속성이 전달되지 않도록 하려면 false 이 특성을 설정합니다.