![](/img/trans.png)
[英]Multiple Projects in .Net Solution - Combine Build Artifacts from all projects
[英]Retargeting All Projects in a Solution to .NET 4.5.2
我在 Visual Studio 2012 中有一個解決方案,其中包含 170 個 C# 項目。 我需要將所有項目從 .NET Framework 4.0 重新定位到 4.5.2。
我更喜歡讓 Visual Studio 通過進入每個項目的屬性、更改目標框架並讓 Visual Studio 對 .csproj 文件進行任何必要的更改來處理此問題。
我注意到這些更改包括向 .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的修復程序。 希望這些會合並,但我不會屏住呼吸。
如果其他人看到與 Anas 相同的錯誤(在評論中),這是幾周前的 GitHub 問題,以及 2017 年的另一個可能相關的問題。如果您遇到同樣的問題,請考慮豎起大拇指並添加更多詳細信息.
對於 .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>
由於目標框架遷移器壞了,我自己進行了搜索/替換(使用 git bash,它在 Windows 上可以正常工作); 基本上它將v4.6.x更改為v4.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
我為整個解決方案構建了一個簡單的工具來遷移目標框架版本,因為目標框架遷移器擴展不支持 Visual Studio 2017。從我的 GitHub 存儲庫下載該工具https://github.com/Xpitfire/TargetFrameworkMigrator
我知道這不是最好的方法,但它對我有用,也許它也會幫助其他人。
目標框架遷移器非常有用。 默認情況下,它會達到 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 后,您將看到新版本。
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.