Visual Studio 2022가 MSBuild의 64비트 프로세스에 미치는 영향

안녕하세요.Visual Studio는 2022에 11/8에 출시됩니다.
Visual Studio 2022는사상 최초로 64비트 프로세스화된 통합 개발 환경(IDE)로, 32비트 버전은 제공하지 않으며 64비트 버전만 출시됩니다.이번에는 Visual Studio 2022 프로세스(devenv.exe)의 64비트 특화와 MSBuild의 관계성과 영향에 대해 소개하겠습니다.
원래 우체통은여기.입니다.(본 안건은 다음과 같은 직위의 의역과 유사하다)
MSBuild
Microsoft Build EngineMSBuild은 말 그대로 어플리케이션을 구축하는 플랫폼입니다.
의외로 MSBuild는 Visual Studio에 의존하지 않습니다.Visual Studio가 MSBuild를 주관하고 있습니다.(따라서 프로젝트와 해결 방안에 대해 msbuild.exe를 실행하면 구축할 수 있다) 즉, Visual Studio의 프로세스가 64비트로 바뀌었다는 것은 MSBuild의 프로세스 자체도 64비트 버전을 사용했다는 것을 의미한다.일반적으로 문제가 되지는 않지만 Visual Studio 2022의 빌드 객체에는 32비트 작업만 포함되고 32비트 작업으로 제대로 표시되지 않으면 빌드가 실패할 수 있습니다.
문제에 부합되는지 검사하는 가장 간단한 방법
64bit 버전의 MSBuild를 사용하여 구축해 보십시오.참고로 Visual Studio와 Build Tools에는 Visual Studio 2013~64비트의 MSBuild가 포함돼 있어 VS2022로 이전하기 전에 확인할 수 있다.
배경 및 수정점
MSBuild는 Visual Studio 및 입니다.NET SDK 양측 모두 함께 제공됩니다.여기에 설명된 변경 사항은 Visual Studio MSBuild에만 적용되며 구현에 영향을 주지 않습니다dotnet build.
MSBuild에는 32비트 및 64비트 실행 파일이 있습니다.둘 다 Visual Studio 및 Visual Studio Build Tools에 포함되어 있으며 설치 경로를 지정할 때 msbuild을 사용합니다.exe를 호출할 때 32비트 버전과 64비트 버전을 선택할 수 있습니다.또한 Visual Studio의 Developer Command Proompt에서 MSBuild를 포함하는 bin 폴더를 설정할 수 있습니다.
Visual Studio 2019는 Visual Studio를 구축할 때 32비트 MSBuild의 마지막 버전인 IDE를 사용했습니다.Visual Studio 2022는 64비트 프로세스로 현실에서 MSBuild를 실행하기 때문에 F5Ctrl-F5시를 포함하여 64비트 버전의 MSBuild를 내부적으로 실행했다.즉 64비트 프로세스가 변경됨에 따라 Visual Studio 개발자는 PATH 내의 64비트 버전 MSBuild 호출을 시작하라는 명령을 내렸다(이전 버전에서는 32비트 실행 파일의 경로가 PATH에 포함되었다).
32비트 MSBuild는 기본적으로 Azure PipelinesVisual Studio BuildMSBuild 작업에서 수행됩니다.이것을 변경하려면 YAMLJob의 정의msbuildArchitecture: 'x64'에 지정합니다.GiitHub Actions에서는 setup-msbuild 동작에서 msbuild-architecture: 'x64'를 사용하여 동일한 설정을 지정할 수도 있습니다.
도대체 어떤 영향이 있습니까?
환경 간의 Windows 변경으로 인해 32비트 파일 시스템과 레지스트리의 리디렉션에 따라 구축된 일부가 변경될 경우 문제가 발생할 수 있습니다.
대부분의 MSBuild 작업은 Any CPU를 위한 것이기 때문에 64비트 환경에서 수행하는 데 문제가 없습니다.많은 작업이 명령줄에서 도구 ("shell out") 를 시작하지만, 도구는 자신의 과정에서 실행되기 때문에 작업이 32비트인지 64비트인지 다를 것이 없습니다.
그러나 일부 작업은 로컬 프로그램 라이브러리가 p/invoke를 시작할 때 실행되는 구조에 민감합니다.
작업을 유지 관리할 때 64비트 환경에서 다시 쓸 필요가 없습니다.대신 MSBuild가 올바른 비트 수 프로세스에서 실행되고 있음을 표시할 수 있습니다.
64비트 버전의 MSBuild는 프로그램 밖에서 32비트 작업을 시작할 수 있고 32비트 버전에서는 64비트 작업을 시작할 수 있다.다음 항목을 참조하십시오.
Visual Studio SDK 64비트 MSBuild의 호환성 문제도 발생할 수 있습니다.이 작업 중 C++로 작성된 32비트(x86용)의 라이브러리를 사용하는 Thin Wrapper.이 문제는 Visual Studio 2022의 라이프 사이클 초기 단계에서 발견됨Microsoft.VSSDK.BuildTools 16.8.1015 이후 Visual Studio SDK가 64비트 MSBuild를 지원하기 위해 다음과 같은 방법으로 업데이트되었습니다.
임무 소유자(NuGet 포장)에 대한 지침
32비트 또는 64비트 환경에서 작업을 지원하기 위해 로컬 구성 요소의 복사본을 고칠 수 있지만, 이런 방법은 보통 어렵다64비트 빌드에서 시작하더라도 32비트 프로세스에서 작업을 수행하도록 MSBuild를 설정하는 것이 좋습니다.
이 경우 새로운 프로세스를 시작하여 통신해야 하기 때문에 기존 MSBuild 프로세스에서 작업을 수행하는 것보다 구축하는 데 더 많은 시간이 걸릴 수 있습니다.다만, 구축에서 임무가 여러 번 호출되지 않으면 문제가 되지 않는다.
퀘스트는 UsingTask 요소에서 사용할 수 있습니다.UsingTask 지정된 요소의 Architecture 속성을 통해 특정한 실행 환경작업 설정을 요구할 수 있다.
32비트 구성 요소 UsingTask 를 잘 지정할 수 있다면 다음과 같습니다.
<UsingTask TaskName="TaskThatNeedsX86Library"
           AssemblyFile="$(MSBuildThisFileDirectory)ArchSpecificTasks.dll"
           Architecture="x86" />
MSBuild 예.NET4.5 및 Visual Studio 2012 이후에는 서로 다른 아키텍처에서 작업을 수행할 수 있으므로 이 변경 사항은 후방 호환성을 갖습니다.Architecture를 지정해도 32비트 MSBuild 환경에서 작업의 실행 방법은 바뀌지 않지만 64비트 MSBuild는 32비트 보조 프로그램으로 작업을 수행합니다.따라서 Visual Studio 2022(MSBuild17)를 무조건 변경하거나 테스트하지 않는 것이 좋습니다.
시험해 보다
일부 구축 방안에서 수정 내용이 유효한지 확인하기 위해 임무를 테스트하는 것을 권장합니다.
  • Visual Studio 2019의 UI driven 구축(이 장면에서 리셋되지 않았음을 확인)
  • Visual Studio 2019(MSBuild16)의 32비트 버전MSBuild.exe을 사용한 명령행 빌드
  • Visual Studio 2019(MSBuild16)의 64비트 버전MSBuild.exe을 사용한 명령행 빌드
  • Visual Studio 2022의 UI driven 구축(향후 주요 개발자 시나리오)
  • Visual Studio 2022(MSBuild17)의 64비트 버전MSBuild.exe을 사용한 명령줄 구축
  • .NET SDK 명령줄을 사용하여 구성합니다(작업이 환경을 지원할 경우).이것들은 dotnet build을 사용했기 때문에 이번 변경의 영향을 받지 않을 것이다.
  • 알려진 문제
    임무는 32비트만 컴파일했다.NET 어셈블리에서 정의한 경우 UsingTask 요소가 정확Architecture하더라도 MSBuild는 다음 오류로 인해 작업 로드에 실패합니다.
    S:\BitnessInMSBuild\ShowErrors.proj(13,5): error MSB4062: The "TaskCompiledForx86" task could not be loaded from the assembly S:\BitnessInMSBuild\TaskCompiledForx86\bin\Debug\net472\TaskCompiledForx86.dll. Could not load file or assembly 'file:///S:BitnessInMSBuildTaskCompiledForx86binDebugnet472TaskCompiledForx86.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format. Confirm that the <UsingTask> declaration is correct, that the assembly and all its dependencies are available, and that the task contains a public class that implements Microsoft.Build.Framework.ITask.
    
    이것은 dotnet/msbuild#6461에서 추적되었다.
    이 문제를 피하기 위해 작업 구성 요소를 Any CPU로 다시 컴파일하고 Architecture 지정합니다.이 경우 MSBuild 엔진은 64비트 환경에서 작업을 로드할 수 있지만 32비트 프로세스에서만 수행할 수 있습니다.
    자신이 없는 작업에 대한 사용자 완화 정책
    죄송합니다. 제어UsingTask 요소가 없으면 작업 설정 오류를 피하기 어렵습니다.dotnet/msbuild#5541에서 프로젝트 내의 오류UsingTask를 다시 쓰기 쉽게 하기 위한 변경 사항을 추적합니다.앞으로 Visual Studio/MSBuild가 출시되면 이 기능이 유용한지 꼭 알려 주십시오.
    Next Step
    Visual Studio 2022로 업그레이드하십시오.64비트 MSBuild는 새로운 기능을 제공합니다.나는 모두가 시도할 수 있기를 기대하고 있다.업그레이드 및 64비트 MSBuild에 대한 체험담을 꼭 들어보겠습니다!피드백을 기다리고 있습니다.

    이상은 Rainer Sigwald선생님입니다.
    그럼 안녕하세요.

    좋은 웹페이지 즐겨찾기