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


96

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

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

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

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


이 작업을 자동으로 수행하는 방법을 모르겠습니다. 키보드 명령을 사용하는 표준 Windows 매크로 레코더가 최선의 방법이라고 생각합니다.하지만 일괄 처리를 시도하기보다는 한 번에 하나씩 실행합니다. 모든 경우에 VS가 작업을 완료하는시기를 식별하기 어려울 수 있기 때문에 함께.
Erik Funkenbusch 2015

1
아니요, 이러면 안됩니다. 특히 4.5.2는 아니지만 유용한 새로운 유형이 없으며 향후 다중 타겟팅 팩에서 다루지 않을 것입니다. 4.0x가 그렇지 않은 것처럼. 이 수행 시간과 필요한 유일한 사람에 프로젝트를. 것들은 어디 실제로 조립 새로운 참조를 추가하고 사용하는 코드를 수정합니다. 이 조언을 무시하고 싶다면 편집> 찾기 및 바꾸기> 파일에서 바꾸기를 사용하여 * .csproj 파일의 TargetFrameworkVersion 요소를 바꾸십시오. 소스 컨트롤이 확실한지 확인하십시오.
Hans Passant 2015

1
@HansPassant 찾기 / 바꾸기의 솔루션은 내 질문에 따라 내가하고 싶지 않은 것입니다. 더 강력한 솔루션이 필요합니다.
Kyle V.

@GrantWinney I / know / 이미 찾기 / 바꾸기를 시도했기 때문에 작동하지 않으며 해당 방법을 사용하면 Visual Studio에서 수행했을 추가 .csproj 변경 사항이 구현되지 않습니다.
Kyle V.

1
@GrantWinney Target Framework Migrator 확장은 내가 원하는 것을 정확히 수행합니다. 답을 만들 수 있다면 정답으로 표시하겠습니다. 감사!
Kyle V.

답변:


84

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 에 대한 수정 사항을 게시했습니다 . 이것이 합쳐지기를 바라지 만 나는 숨을 참지 않을 것이다.

다른 사람이 Anas와 동일한 오류를보고 있다면 (댓글에서) 몇 주 전의 GitHub 문제 와 2017 년의 또 다른 관련 문제 일 수 있습니다. 같은 문제가 발생하면 엄지 손가락을 올려서 자세한 내용을 추가해보세요. .


7
은 "대상 프레임 워크의 Migrator를"도구는 최신 VS 2017 업데이 트 15.5.5에 실패, "잘못된 매개 변수"
아나 GHANEM

1
오늘 VS2017 15.7에서 Framework 4.7로 저를 위해 일했습니다
Tod

MS가 의도적으로 사용자의 이익을 위해 기능을 생략 할 것 같지는 않습니다 ... 훨씬 더 많은 것은 그들이 생각하지 않았거나 지원할 필요가없는 다른 것일 가능성이 높습니다. 커뮤니티에 전달합니다 ..
PJUK

1
@Grant 기존 문제에 댓글을 추가했습니다. 실제로 프로젝트 및 구성 파일에서 찾기 / 검색 및 바꾸기 작업을 수행했습니다.
JB. 모니카 랑.

2
개발자는 2019 년 12 월 바톤을 통과했으며 (좋은) 답변을 다시 수정할 수 있습니다. :)
Ludovic Feltz

12

.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>

1
VS 2019에서는 "모두 바꾸기"가 제대로 작동하지 않습니다. "다음 찾기"를 반복해서 사용해야합니다. 이것은 나의 마지막 Microsoft 기반 개발 프로젝트입니다. 나는 그들의 제품에 대한 일관성과 적절한 수준의 QA가 수행되는 MacOSX로 이동하고 있습니다.
ATL_DEV

1
packages.config에서 targetFramework를 변경해도 해당 프레임 워크의 패키지가 다시 설치되지 않으므로 잘못된 버전으로 끝날 수 있습니다. 패키지를 다시 설치하거나 적어도 패키지 폴더를 삭제하고 올바른 버전의 패키지를 복원해야합니다. 문제는 이전 packages.config 모델에서 재설치하지 않고 패키지의 dll 참조가 패키지의 잘못된 하위 디렉토리에서 잘못된 dll을 대상으로한다는 것입니다.
Triynko

3
와우, 휴가 후 다시이 질문으로 돌아 왔고 동일한 답변에 대해 의견을 말해야 할 필요성을 보았습니다. * .csproj 및 packages.config 파일이 대상 프레임 워크를 참조하는 유일한 파일이 아니라는 점을 추가하겠습니다. 다양한 섹션의 web.config 파일에도 참조가 있습니다. 예를 들어, system.web에서 compilation 및 httpRuntime 태그에는 업데이트가 필요한 targetFramework 속성이 있습니다. 따라서이 '찾기 및 바꾸기'수동 프로세스는 프로젝트를 일관성없고 손상된 상태로 만들 수있는 정말 끔찍한 아이디어처럼 보입니다.
Triynko

9

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

4
나는 이것을 발견했고, 그리고 Update-Package -ReInstall는 놀라운 일을했다. 감사!
askrich

1
이것은 나를 위해 완벽하게 잘 작동했습니다. 이 솔루션을 주셔서 감사합니다
마리암


7

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

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


이제 확실합니다.
Jay Croghan

3

Target Framework Migrator 는 매우 유용합니다. 기본적으로 v4.7까지 제공됩니다. 그러나 v4.7.1, v4.7.2 및 v4.8에 대한 지원을 추가하는 것은 쉽습니다.

C : \ Users {username} \ AppData \ Local \ Microsoft \ VisualStudio \ 폴더에서 Frameworks.xml 파일을 찾고 다음 프레임 워크 버전을 추가하여 편집합니다.

<Framework Id="262152" Name=".NETFramework,Version=v4.8"/>
<Framework Id="262663" Name=".NETFramework,Version=v4.7.2"/>
<Framework Id="262407" Name=".NETFramework,Version=v4.7.1"/>

Visual Studio를 다시 시작하면 새 버전이 표시됩니다.



감사합니다! 이것은 매우 훌륭하고 쉬운 해결 방법이었습니다!
합병

2
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();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.