ソリューション内のすべてのプロジェクトを.NET 4.5.2にリターゲットする


96

170のC#プロジェクトが含まれるVisual Studio 2012のソリューションがあります。すべてのプロジェクトを.NET Framework 4.0から4.5.2にリターゲットする必要があります。

私は、各プロジェクトのプロパティに移動し、ターゲットフレームワークを変更し、Visual Studioに.csprojファイルに必要な変更を行わせることで、Visual Studioにこれを処理させることを好みます。

これらの変更には、現在のプロジェクトの一部の属性に応じて、いくつかの新しいXMLタグが.csprojに追加されていることに気付きました。

テキスト置換ツールを使用して対象のバージョン番号を置き換えるだけでなく、すべての170個のC#プロジェクトをバッチで対象変更するにはどうすればよいですか?Visual Studioに必要なすべてのタグの変更と追加を行い、置換だけではそれが起こらないようにしたいと思います。


これを自動的に実行する方法はわかりません。キーボードコマンドを使用する標準のWindowsマクロレコーダーをお勧めします。ただし、バッチ処理ではなく、一度に実行します。すべてのケースでVSがその作業をいつ完了したかを特定することが難しい場合があるためです。
Erik Funkenbusch 2015

1
いいえ、これを行うべきではありません。 特に 4.5.2ではなく、有用な新しいタイプがなく、将来のマルチターゲティングパックでカバーされる可能性は低いです。4.0xがそうでなかったように。これを行う1時間、それを必要とするものだけでプロジェクトを。あなたがものを実際に新しい参照アセンブリを追加し、それらを使用するためにコードを変更したいです。このアドバイスを無視したい場合は、おそらくそうします。次に、編集>検索と置換>ファイルで置換を使用して、*。csprojファイルのTargetFrameworkVersion要素を置換します。ソース管理がしっかりしていることを確認してください。
ハンスパッサント2015

1
@HansPassant質問によると、検索/置換のソリューションは、まさに私がしたくなかったものです。より堅牢なソリューションが必要です。
カイルV.

@GrantWinney I / know /すでにFind / Replaceを試したので機能しません。その方法を使用すると、Visual Studioが行う追加の.csprojの変更が実装されません。
カイルV.

1
@GrantWinney Target Framework Migrator拡張機能は、まさに私が望んでいたことを行います。回答を作成していただければ、正解とさせていただきます。ありがとう!
カイルV.

回答:


84

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

ただし、Visual Studioギャラリーでは、Target Framework Migratorと呼ばれる(評価の高い)拡張機能を利用できます。これは、4.5.2(および新しいバージョン**)へのアップグレードをサポートし、期待どおりの動作をするように見えます。興味があれば、ソースコードはGitHubから入手できます。

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

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


これは何年も開発されておらず、明らかに開発者は誰かにバトン渡す計画はありません。

新しい.NET Frameworkバージョンで機能しない場合は、既存のPR問題の修正を確認してください。ただし、自分で適用する必要がある場合があります。たとえば、誰かが.NET Framework v 4.7.1の修正を投稿しました。うまくいけば、これらは統合されるでしょうが、私は息を止めません。

他の誰かがアナスと同じエラーを(コメントで)表示している場合、2週間前のGitHubの問題と、2017年の関連する可能性のある別の問題を次に示します。同じ問題が発生している場合は、親指を上げて詳細を追加することを検討してください。


7
「ターゲットフレームワークマイグレーター」ツールは、最新のVS 2017アップデート15.5.5、「無効なパラメーター」で失敗します
Anas Ghanem

1
今日はVS2017 15.7からFramework 4.7まで私のために働きました
Tod

MSがユーザーの利益のために機能を意図的に省略していることを私は非常に疑っています...それはおそらく、それがユーザーが考えなかった、またはサポートする必要のない他の何かである...コミュニティにそれを渡す..
PJUK

1
@付与既存の問題にコメントを追加しました。実際には、プロジェクトファイルと構成ファイルでfind / sed検索と置換を使用して作業を行いました。
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ベースの開発プロジェクトです。私はMacOSXに移動します。MacOSXでは、一貫性があり、適切なレベルのQAが製品で実行されています。
ATL_DEV

1
packages.configでtargetFrameworkを変更しても、そのフレームワークのパッケージは再インストールされないため、誤ったバージョンになる可能性があります。パッケージを再インストールするか、少なくともパッケージフォルダを削除して、パッケージの正しいバージョンを復元する必要があります。問題は、古いpackages.configモデルにあり、再インストールしないと、パッケージのdll参照が、パッケージの間違ったサブディレクトリにある間違ったdllをターゲットにしていることになります。
Triynko

3
うわー、休暇の後でこの質問に戻ってしまいました。また、この同じ答えについてコメントする必要がありましたね。* .csprojおよびpackages.configファイルだけがターゲットフレームワークを参照するものではないことを付け加えます。さまざまなセクションのweb.configファイルにも参照があります。たとえば、system.webの場合、コンパイルタグとhttpRuntimeタグには、更新が必要なtargetFramework属性があります。したがって、この「検索と置換」の手動プロセスは、プロジェクトを一貫性のない破損した状態にしてしまう可能性がある、本当にひどい考えのようです。
Triynko

9

以来ターゲットフレームワーク移行が壊れている、私は自分の検索を巻い/置き換え(gitのはbashを使用して、それがWindows上で動作しますOK)。基本的には、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 2018年

1
これは完全にうまくいきました。この解決策をありがとう
マリアム

powershellバージョンについては、stackoverflow.com
a / 2837891/463425

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.