web-dev-qa-db-ja.com

ソリューション内のすべてのプロジェクトを.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で必要なすべてのタグの変更と追加を行い、置換だけではそれが許可されないようにします。

79
Kyle V.

MSDNドキュメント「 。NET Framework 4.5への移行ガイド 」および「 。NET Framework 4または4.5をサポートするようにアプリを構成する方法 」では、プロジェクトの変更についてのみ説明しています。ソリューション全体に変更を一度に適用することに関する詳細はありません。また、VSでそれをサポートする機能を見たこともありません。

ただし、Visual Studioギャラリーには Target Framework Migrator と呼ばれる(評価の高い)拡張機能があり、4.5.2(および新しいバージョン**)へのアップグレードをサポートしており、まさにあなたが望むことをしてください。興味がある場合は、ソースコードは GitHub で入手できます。

このような機能の欠如は意図的なものである可能性があることに注意してください(単なる省略ではありません)。私は推測しているだけですが、MSは新しいフレームワークがアップグレードされるneedプロジェクトのみを予測しているのかもしれません。 FWIW、他のソリューションと共有されているいくつかのプロジェクトをアップグレードすると、they'reもアップグレードされるまで、それらのソリューションはビルドに失敗する可能性があります。

そうは言っても、1つ(または数個)のソリューションを備えた小さな店で、すべてを一度にアップグレードしたい場合は、おそらく上記のツールが役立ちます。


**最近はあまり開発されていません。新しい.NET Frameworkバージョンで動作させることができない場合は、既存の PRs および Issues で修正を確認してください。たとえば、誰かが 。NET Framework v 4.7.1の修正 を投稿しました。これらが最終的にマージされることを願っています。

73
Grant

Target Framework Migrator ExtensionはVisual Studio 2017をサポートしていないため、ソリューション全体のターゲットフレームワークバージョンを移行する簡単なツールを自分で作成しました。GitHubリポジトリからツールをダウンロードします https://github.com/ Xpitfire/TargetFrameworkMigrator

私はこれが最善の方法ではないことを知っていますが、私にとってはうまくいきましたし、おそらく他の人にも役立つでしょう。

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

.NET Frameworkソリューションの場合、単純な「Replace in files」が私にとってはうまくいきました。

eg:From 。NET Framework 4.5.2 to 。NET Framework 4.7.2

package.configファイルで、すべてを置き換えます

targetFramework="net452" 

targetFramework="net472" 

*。csprojファイルで、すべてを置き換えます

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
1
webpat
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();
}
0
MaxR