我們正在嘗試使用 Microsoft.Build NuGet 包以編程方式分析解決方案檔案中的配置映射。
例如,當使用 Release 構建解決方案時,能夠檢測何時使用 Debug 構建專案。
我們可以使用 SolutionFile.Parse 加載解決方案檔案,但不清楚如何分析配置映射。
有可能做這樣的事情嗎?
uj5u.com熱心網友回復:
我創建了一個空白解決方案,添加了一個專案,然后編輯了解決方案和專案中的配置,分別添加了“Sln”和“Proj”前綴。該解決方案具有“SlnDebug”和“SlnRelease”。該專案具有“ProjDebug”和“ProjRelease”。
這將產生以下 SLN 檔案:
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.3.32929.385
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Project", "Project\Project.csproj", "{6056F2E8-3ED1-4992-92B6-2BD1D721F940}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
SlnDebug|Any CPU = SlnDebug|Any CPU
SlnRelease|Any CPU = SlnRelease|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6056F2E8-3ED1-4992-92B6-2BD1D721F940}.SlnDebug|Any CPU.ActiveCfg = ProjDebug|Any CPU
{6056F2E8-3ED1-4992-92B6-2BD1D721F940}.SlnDebug|Any CPU.Build.0 = ProjDebug|Any CPU
{6056F2E8-3ED1-4992-92B6-2BD1D721F940}.SlnRelease|Any CPU.ActiveCfg = ProjDebug|Any CPU
{6056F2E8-3ED1-4992-92B6-2BD1D721F940}.SlnRelease|Any CPU.Build.0 = ProjDebug|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C9B115D6-91A4-4330-B2C6-8BDCA08881F0}
EndGlobalSection
EndGlobal
以下行將解決方案的“ Sln Debug|Any CPU”的配置|平臺映射到專案的“ Proj Debug|Any CPU”的配置|平臺。
{6056F2E8-3ED1-4992-92B6-2BD1D721F940}.SlnDebug|Any CPU.ActiveCfg = ProjDebug|Any CPU
{6056F2E8-3ED1-4992-92B6-2BD1D721F940}.SlnDebug|Any CPU.Build.0 = ProjDebug|Any CPU
將此 SLN 檔案用作測驗檔案將有助于了解SolutionFile.Parse(string solutionFile)正在做什么。有關檔案格式的檔案,另請參閱“解決方案 (.sln) 檔案”。
以下代碼示例決議解決方案檔案并比較解決方案級別和專案級別的配置和平臺值。
using Microsoft.Build.Construction;
const string slnFilePath = @"<test solution file path and name>";
var solution = SolutionFile.Parse(slnFilePath);
foreach (var project in solution.ProjectsInOrder)
{
Console.WriteLine($"Project '{project.ProjectName}'");
foreach (var pair in project.ProjectConfigurations)
{
Console.WriteLine($" Solution Configuration|Platform '{pair.Key}'");
var (slnConfiguration, slnPlatform) = pair.Key.Split('|', 2, StringSplitOptions.TrimEntries) switch { var strs => (strs[0], strs[1]) };
var projConfiguration = pair.Value.ConfigurationName;
var projPlatform = pair.Value.PlatformName;
Console.WriteLine($" '{slnConfiguration}' {(slnConfiguration == projConfiguration ? "matches" : "does not match") } '{projConfiguration}'.");
// Special case for 'Any CPU' and 'AnyCPU'.
if (slnPlatform == "Any CPU" && projPlatform == "AnyCPU")
{
Console.WriteLine($" '{slnPlatform}' matches '{projPlatform}'.");
}
else
{
Console.WriteLine($" '{slnPlatform}' {(slnPlatform == projPlatform ? "matches" : "does not match")} '{projPlatform}'.");
}
}
}
請注意“任何 CPU”的特殊情況。由于遺留原因,解決方案使用“Any CPU”(有空格),專案使用“AnyCPU”(沒有空格),這應被視為匹配平臺。
此示例代碼旨在說明如何使用SolutionFile回傳的物件,Parse()并希望這可以使映射更清晰。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/526695.html
上一篇:VisualStudio:如何為GUI構建操作找到相應的CLI命令?
下一篇:MVC表單資料無法系結到模型
