Programing

솔루션의 모든 프로젝트 대상을 .NET 4.5.2로 변경

crosscheck 2020. 10. 6. 07:52
반응형

솔루션의 모든 프로젝트 대상을 .NET 4.5.2로 변경


Visual Studio 2012에 170 개의 C # 프로젝트가 포함 된 솔루션이 있습니다. .NET Framework 4.0에서 4.5.2로 모든 프로젝트의 대상을 변경해야합니다.

각 프로젝트의 속성으로 이동하여 대상 프레임 워크를 변경하고 Visual Studio가 .csproj 파일에 필요한 변경을 수행하도록하여 Visual Studio에서이를 처리하도록하는 것을 선호합니다.

이러한 변경 사항에는 현재 프로젝트의 일부 속성에 따라 .csproj에 몇 가지 새로운 XML 태그를 추가하는 것이 포함됩니다.

대상 버전 번호를 바꾸기 위해 텍스트 바꾸기 도구를 사용하지 않고 170 개의 모든 C # 프로젝트를 일괄 적으로 다시 대상화하려면 어떻게해야합니까? Visual Studio가 필요한 모든 태그 수정 및 추가를 수행하기를 원하며 대체만으로는 그렇게 할 수 없습니다.


MSDN 설명서 " .NET Framework 4.5 로의 마이그레이션 가이드 "및 " .NET Framework 4 또는 4.5를 지원하도록 앱을 구성하는 방법 "에서는 프로젝트 수정에 대해서만 설명합니다. 한 번에 전체 솔루션에 변경 사항을 적용하는 것에 대한 세부 정보가 없으며 VS에서 지원하는 기능을 본 적이 없습니다.

그러나 Visual Studio 갤러리에서 사용할 수있는 Target Framework Migrator 라는 (잘 평가 된) 확장이 있는데,이 확장은 4.5.2 (최신 버전 **) 로의 업그레이드를 지원하며 원하는대로 정확히 수행 할 수 있습니다. 관심이 있다면 GitHub 에서 소스 코드를 사용할 수 있습니다 .

이러한 기능이없는 것은 의도적 인 것일 수 있습니다 (단순한 누락이 아닙니다). 나는 추측하고 있지만 MS 는 새로운 프레임 워크가 필요한 프로젝트 만 업그레이드 될 것이라고 생각합니다. 다른 솔루션을 공유하는 몇 가지 프로젝트를 업그레이드 끝날 경우까지 FWIW는, 그 솔루션은 빌드에 실패 할 수 있습니다 그들이있어 너무 업그레이드.

즉, 하나 (또는 ​​몇 개)의 솔루션 만있는 소규모 상점에서 모든 것을 한 번에 업그레이드하려는 경우 위의 도구가 적합 할 것입니다.


** 최근에는 많이 개발되지 않았습니다. 최신 .NET Framework 버전에서 작동하도록 할 수없는 경우 기존 PR문제 에서 수정 사항을 확인하십시오 . 예를 들어 누군가 .NET Framework v 4.7.1 에 대한 수정 사항을 게시했습니다 . 바라건대 이들은 결국 병합 될 것입니다.


Target Framework Migrator Extension은 Visual Studio 2017을 지원하지 않기 때문에 전체 솔루션의 대상 프레임 워크 버전을 마이그레이션하는 간단한 도구를 직접 만들었습니다. 내 GitHub 저장소 https://github.com/Xpitfire/TargetFrameworkMigrator 에서 도구를 다운로드합니다.

이것이 최선의 방법이 아니라는 것을 알고 있지만 저에게 효과적이며 다른 사람에게도 도움이 될 것입니다.


.NET Framework 솔루션의 경우 간단한 " 파일에서 바꾸기 "가 나를 위해 트릭을 수행했습니다.

: .NET Framework 4.5.2 에서 .NET Framework 4.7.2로

에서 package.config 파일을 모두 교체

targetFramework="net452" 

...에

targetFramework="net472" 

에서 * .csproj 파일을 모두 교체

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

...에

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>

Target Framework Migrator 가 손상 되었기 때문에 자체 검색 / 바꾸기를 롤링했습니다 (git bash 사용, Windows에서 정상적으로 작동 함). 기본적으로는 변경 v4.6.xv4.7.2을 , 다음은 악명 DOS의 CRLF를 사용하여 파일을 다시 변환 :

find . \( -iname '*.csproj' -o -iname '*.vcxproj' -o -iname 'app.config' \) \
 -exec grep -Z -l 'v4\.6\..' \{} \; | xargs -0 sed -i 's/v4\.6\../v4.7.2/'  
find . \( -iname '*.csproj' -o -iname '*.vcxproj' -o -iname 'app.config' \) \
 -exec grep -Z -l 'v4\.7\..' \{} \; | xargs -0 unix2dos

public void ChangeFramework() {

  //Add Reference to envdte (Assemblies\Extensions\envDTE)
  string SolutionFile = @"C:\MyProject\MyProject.sln";
  string ProjectName = "MyProject";

  //------------------------------------------------------------------------
  //Find the Program ID from the registry for VisualStudio.DTE
  //Look it up In Registry: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes
  System.Type oType = System.Type.GetTypeFromProgID("VisualStudio.DTE", true);
  EnvDTE.DTE dte = (EnvDTE.DTE)Activator.CreateInstance(oType, true);

  //------------------------------------------------------------------------
  //Open your Solution
  dte.Solution.Open(SolutionFile);

  //------------------------------------------------------------------------
  //Now In your solution go through what is listed in dte.Solution.Projects 
  //and find the one that match what you want to change target for
  int iItemsCount = dte.Solution.Projects.Count;
  string sCurrent = "";

  for (int i = 1; i <= iItemsCount; i++) {

    sCurrent = dte.Solution.Projects.Item(i).Name;

    if (dte.Solution.Projects.Item(i).Name == ProjectName) {
      //Once you find your project, Change the Framework
      EnvDTE.Project oProject = dte.Solution.Projects.Item(i);
      oProject.Properties.Item("TargetFrameworkMoniker").Value = ".NETFramework,Version = v4.6.2";
    }
  }

  //------------------------------------------------------------------------
  //Close your Solution
  dte.Solution.Close();
}

참고 URL : https://stackoverflow.com/questions/28436066/retargeting-all-projects-in-a-solution-to-net-4-5-2

반응형