在Visual Studio中打开一个解决方案后,我如何快速检查解决方案中各个项目所针对的目标框架?是否有一种解决方案级别的视图能够显示每个项目所指定的目标框架,或者显示有多少个项目使用了每个框架版本?
我知道可以逐个检查每个项目(通过属性窗口或者csproj
文件本身),但是在一个包含100多个项目的解决方案中这样做是不可行的。
此外,我知道可以在根文件夹中csproj
文件内进行正则表达式搜索,但我想知道是否有内置于Visual Studio中提供此数据的功能。
在Visual Studio中打开一个解决方案后,我如何快速检查解决方案中各个项目所针对的目标框架?是否有一种解决方案级别的视图能够显示每个项目所指定的目标框架,或者显示有多少个项目使用了每个框架版本?
我知道可以逐个检查每个项目(通过属性窗口或者csproj
文件本身),但是在一个包含100多个项目的解决方案中这样做是不可行的。
此外,我知道可以在根文件夹中csproj
文件内进行正则表达式搜索,但我想知道是否有内置于Visual Studio中提供此数据的功能。
Directory.Build.targets
的文件,该文件会打印出TargetFramework
值。<Project>
<Target Name="LogTargetFramework" AfterTargets="CoreCompile">
<Message
Importance="high"
Text="Project $(MSBuildProjectName): $(TargetFramework)"/>
</Target>
</Project>
将其添加到例如MetadataExtractor解决方案中并重新构建会产生以下结果:
1>Project MetadataExtractor: net35
1>Project MetadataExtractor: net45
1>Project MetadataExtractor: netstandard2.0
1>Project MetadataExtractor: netstandard1.3
3>Project MetadataExtractor.PowerShell: net40
2>Project MetadataExtractor.Samples: net48
5>Project MetadataExtractor.Tools.JpegSegmentExtractor: net6.0
4>Project MetadataExtractor.Benchmarks: net461
7>Project MetadataExtractor.Tests: net472
6>Project MetadataExtractor.Tools.FileProcessor: net6.0
7>Project MetadataExtractor.Tests: net6.0
CoreCompile
。无论项目类型如何,这是否总是发生在增量构建中? - julealgon****
),以便轻松地筛选它们(手动或使用命令行工具)。 - Drew Noakes我找不到任何东西,所以决定编写一个脚本:
# Set root folder to current script location
$rootFolder = $PSScriptRoot
$solutionName = '[YOUR_SOLUTION_PATH]'
# Define the path to the solution file
$solutionFile = Join-Path $rootFolder $solutionName
# Read the contents of the solution file
$solutionText = Get-Content $solutionFile
# Use a regular expression to extract the names of the project files
$projectFiles = [regex]::Matches($solutionText, 'Project\("{([A-Za-z0-9-]+)}"\) = "([^"]+)", "([^"]+.csproj)"') | ForEach-Object { $_.Groups[3].Value } | Sort-Object
# Define project collection
$projects = @()
# Iterate over each project file
foreach ($projectFile in $projectFiles) {
# Read the contents of the project file
$projectText = Get-Content (Join-Path $rootFolder $projectFile)
# Determine whether it is a SDK style project
$isSdkProject = [regex]::IsMatch($projectText, '<Project Sdk="Microsoft.NET.Sdk">')
# Use a regular expression to extract the target framework
$targetFramework = [regex]::Match($projectText, '<TargetFramework>(.+)</TargetFramework>')
# Get the target framework
$foundFramework = if ($targetFramework.Success) { $($targetFramework.Groups[1].Value) } else { 'None' }
# Add to projects collection
$projects += [pscustomobject]@{ Project=$projectFile; SdkFormat=$isSdkProject; TargetFramework=$foundFramework; }
}
# Output projects as table
$projects | Format-Table
# Display summary
Write-Host $projects.Count "projects found"
它列出了所有项目、它们的目标框架以及它们是否是 SDK 样式。