다음을 통해 공유


대상 및 작업 구성

선택한 MSBuild 작업은 개발 컴퓨터가 대상 환경을 지원할 때 대상 환경에서 실행되도록 설정할 수 있습니다. 예를 들어 64비트 Windows 컴퓨터를 사용하여 32비트 Windows 아키텍처를 대상으로 하는 애플리케이션을 빌드할 경우 선택한 작업은 32비트 프로세스에서 실행됩니다.

참고 항목

빌드 작업이 Visual C# 또는 Visual Basic 같은 .NET 언어로 작성되고 네이티브 리소스 또는 도구를 사용하지 않는 경우 조정 없이도 모든 대상 컨텍스트에서 실행됩니다.

UsingTask 특성 및 작업 매개 변수

다음 UsingTask 특성은 특정 빌드 프로세스에서 작업의 모든 작동에 영향을 줍니다.

  • Runtime 특성(있는 경우)은 CLR(공용 언어 런타임) 버전을 설정하고 CLR2, CLR4, CurrentRuntime 또는 *(임의 런타임) 값 중 하나를 사용할 수 있습니다.

  • Architecture 특성(있는 경우)은 플랫폼 및 비트를 설정하고 x86, x64, CurrentArchitecture 또는 *(임의 아키텍처) 값 중 하나를 사용할 수 있습니다.

  • TaskFactory 특성은(있는 경우) 작업 인스턴스를 만들고 실행하는 작업 팩터리를 설정하고 값 TaskHostFactory만 사용합니다. 자세한 내용은 이 문서 뒷부분에 나오는 작업 팩터리를 참조하세요.

<UsingTask TaskName="SimpleTask"
    Runtime="CLR2"
    Architecture="x86"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v3.5.dll" />

MSBuildRuntimeMSBuildArchitecture 매개 변수를 사용하여 개별 작업 호출의 대상 컨텍스트를 설정할 수도 있습니다.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="MyTarget">
        <SimpleTask MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

MSBuild가 작업을 실행하기 전에 동일한 대상 컨텍스트를 갖는 일치하는 UsingTask를 찾습니다. UsingTask에 지정되어 있으나 해당 작업에는 지정되지 않은 매개 변수는 일치하는 항목으로 간주됩니다. 작업에 지정되어 있으나 해당 UsingTask에는 지정되지 않은 매개 변수도 일치하는 항목으로 간주됩니다. 매개 변수 값이 UsingTask 및 작업 둘 다에 지정되지 않은 경우 값의 기본값은 *(임의 매개 변수)입니다.

Warning

둘 이상의 UsingTask가 존재하며 모두 일치하는 TaskName, RuntimeArchitecture 특성을 갖는 경우 첫 번째로 평가되는 특성이 다른 특성을 대신합니다. 이는 PropertyTarget 요소의 동작과 다릅니다.

매개 변수가 작업에 설정되어 있으면 MSBuild는 이러한 매개 변수와 일치하거나 적어도 충돌하지 않는 UsingTask를 찾으려고 합니다. 둘 이상의 UsingTask는 동일한 작업의 대상 컨텍스트를 지정할 수 있습니다. 예를 들어, 대상 환경마다 다른 실행 파일을 갖는 작업은 다음과 비슷할 수 있습니다.

<UsingTask TaskName="MyTool"
    Runtime="CLR2"
    Architecture="x86"
    AssemblyFile="$(MyToolsPath)\MyTool.v2.0.dll" />

<UsingTask TaskName="MyTool"
    Runtime="CLR4"
    Architecture="x86"
    AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="MyTarget">
        <MyTool MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

기본 UsingTasks 재정의

기본적으로 MSBuild는 UsingTask를 “첫 번째 승리”로 처리합니다. 17.2부터 MSBuild는 Override 매개 변수를 통해 이 동작을 재정의할 수 있습니다. 매개 변수 Overridetrue로 설정된 UsingTask는 동일한 TaskName의 다른 UsingTask보다 우선합니다.

<UsingTask TaskName="MyTool"
    Runtime="CLR4"
    Architecture="x86"
    Override="true"
    AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />

Warning

이 작업은 작업당 한 번만 수행할 수 있습니다. 동일한 작업에 대해 여러 재정의를 추가하려는 빌드는 MSBuild 오류 MSB4275를 수신합니다.

작업 팩터리

다음 표에서는 MSBuild 설치에서 제공하는 작업 팩터리를 보여줍니다.

작업 팩터리 설명
AssemblyTaskFactory 기본값입니다. In-Process 작업을 실행합니다.
TaskHostFactory out-of-process 작업을 실행합니다.
RoslynCodeTaskFactory C# 또는 Visual Basic으로 작성되고 .NET Standard를 대상으로 하는 인라인 작업의 경우 msbuild.exedotnet build 둘 다에서 작동합니다.
CodeTaskFactory C# 또는 Visual Basic으로 작성되고 .NET Framework를 대상으로 하는 인라인 작업의 경우 msbuild.exe에서만 작동합니다.

작업 팩터리 메커니즘은 확장 가능하므로 타사에서 만든 메커니즘을 사용하거나 직접 만들 수도 있습니다. 직접 만드는 이유는 인라인 작업을 작성할 때 다른 언어를 지원하기 위한 것입니다.

TaskHostFactory

작업을 실행하기 전에 MSBuild는 작업이 현재 소프트웨어 컨텍스트에서 실행되도록 지정되어 있는지 여부를 확인합니다. 작업이 이렇게 지정된 경우 MSBuild는 작업을 현재 프로세스에서 실행하는 AssemblyTaskFactory로 전달하고, 그렇지 않으면 대상 컨텍스트와 일치하는 프로세스에서 작업을 실행하는 TaskHostFactory로 작업을 전달합니다. 현재 컨텍스트 및 대상 컨텍스트가 일치하더라도 TaskFactoryTaskHostFactory로 설정하여 강제로 작업이 out-of-process로 실행되도록 할 수 있습니다(격리, 보안 또는 기타 이유로).

<UsingTask TaskName="MisbehavingTask"
    TaskFactory="TaskHostFactory"
    AssemblyFile="$(MSBuildToolsPath)\MyTasks.dll">
</UsingTask>

TaskHostFactory이 명시적으로 지정된 경우 작업을 실행하는 프로세스는 수명이 짧습니다. 이렇게 하면 운영 체제가 실행 직후 작업과 관련된 모든 리소스를 정리할 수 있습니다. 이러한 이유로 빌드 후 작업 어셈블리를 업데이트할 때 파일 사용 오류를 방지하려면 사용과 동일한 빌드 프로세스에서 빌드된 작업을 참조할 때 TaskHostFactory를 지정합니다.

RoslynCodeTaskFactory

RoslynCodeTaskFactory는 프로젝트 파일에서 작업에 대한 C# 또는 Visual Basic 코드를 작성하고 즉시 사용할 수 있는 메커니즘을 제공합니다. 이 코드는 빌드 프로세스 중에 컴파일되어 동일한 빌드에서 실행 가능한 작업을 생성합니다. 작성하는 코드는 .NET Standard를 대상으로 하므로 MSBuild의 .NET Core(및 .NET 5 이상) 버전을 사용하는 dotnet build 및 .NET Framework를 사용하는 msbuild.exe 실행 시 사용 가능합니다. RoslynCodeTaskFactory는 MSBuild 논리에서 너무 어렵지만 별도의 프로젝트를 만들 만큼 복잡하지 않은 사용자 지정에 가장 적합합니다. RoslynCodeTaskFactory로 MSBuild 인라인 작업 만들기를 참조하세요.

CodeTaskFactory

CodeTaskFactory는 MSBuild의 .NET Framework 버전으로 제한되는 이전 버전의 RoslynCodeTaskFactory입니다. MSBuild 인라인 작업을 참조하세요. 이 작업 팩터리는 지원되지만 더 광범위한 적용을 위해 최신 코드에서 RoslynCodeTaskFactory를 사용해야 합니다.

가상 작업 매개 변수

다른 모든 작업 매개 변수와 마찬가지로 MSBuildRuntimeMSBuildArchitecture는 빌드 속성에서 설정할 수 있습니다.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <FrameworkVersion>3.0</FrameworkVersion>
    </PropertyGroup>
    <Target Name="MyTarget">
        <SimpleTask MSBuildRuntime="$(FrameworkVerion)" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

다른 작업 매개 변수와 달리 MSBuildRuntimeMSBuildArchitecture는 작업 자체에 표시되지 않습니다. 실행되는 컨텍스트를 인식하는 작업을 작성하려면 .NET Framework를 호출하여 컨텍스트를 테스트하거나 빌드 속성을 사용하여 다른 작업 매개 변수를 통해 컨텍스트 정보를 전달해야 합니다.

참고 항목

UsingTask 특성은 도구 집합 및 환경 속성에서 설정할 수 있습니다.

MSBuildRuntimeMSBuildArchitecture 매개 변수는 대상 컨텍스트 뿐만 아니라 가장 제한적인 범위를 설정하는 가장 유연한 방법을 제공합니다. 한편 이러한 매개 변수는 작업 인스턴스 자체에서 설정되고 작업이 실행된 다음에야 평가되기 때문에 평가 시간과 빌드 시간에 모두 사용할 수 있는 전체 범위의 속성에서 값을 파생시킬 수 있습니다. 반면 이러한 매개 변수는 특정 대상에 있는 특정 작업 인스턴스에만 적용됩니다.

참고 항목

작업 매개 변수는 작업 호스트의 컨텍스트가 아니라 부모 노드의 컨텍스트에서 평가됩니다. 런타임 종속적 또는 아키텍처 종속적 환경 변수(예: 프로그램 파일 위치)는 부모 노드와 일치하는 값으로 평가됩니다. 그러나 동일한 환경 변수를 작업에서 직접 읽을 경우 작업 호스트의 컨텍스트에서 올바르게 평가됩니다.