Проблема: мы можем анализировать файл csproj некоторыми способами, но большая часть информации отсутствует в файле, но либо по умолчанию, либо зависит от других свойств.
Я хочу работать с файлами и решением csproj - получать зависимости проекта, свойства и элементы (такие как TargetFramework, скомпилированные файлы ...)
TargetFramework может быть тегом со значением или тегом TargetFrameworks с несколькими значениями, которые анализируются в TargetFramework.
Старое решение - MSBuild предоставляет библиотека microsoft.build.evaluation для работы с файлом csproj, но эта библиотека скомпилирована в net471 и вызывает ошибки, когда мы используем ее в netcoreapp.
Каким будет решение для проблема в основных проектах .net?
@JonSkeet Отредактировано. По поводу Microsoft.Build, Microsoft.Build.Framework, как я уже сказал, он компилировался только в net471.
Что ж, вы сказали о Microsoft.Build.Evaluation - я предполагал, что это пакет NuGet, хотя я не могу найти его на nuget.org. И Microsoft.Build, и Microsoft.Build.Framework включают цели netstandard2.0, поэтому с netcoreapp2.0 все в порядке.
Вы правы, но я не могу найти объект, представляющий файлы csproj в Microsoft.Build или Microsoft.Build.Framework
Если вам нравится идти по маршруту на основе Roslyn, я думаю, что Microsoft.CodeAnalysis.Workspaces.MSBuild может быть тем, что вам нужно. Вы также можете посмотреть на github.com/KirillOsenkov/MSBuildStructuredLog полный пример рабочего кода.
Есть также такие проекты, как Buildalyzer, которые абстрагируют большую часть конфигурации, необходимой для правильной работы пакетов Microsoft.Build.* на каждой платформе, но я не могу сказать, могут ли эти функции вам помочь ..
@Martin Спасибо, я оставил проблему в этом проекте.





Для .Net Core Microsoft.Build пакет NuGet работает следующим образом:
var projectRootElement = ProjectRootElement.Open(csprojPath);
projectRootElement.AddProperty("Version", "3.4.5");
projectRootElement.Save();
Если версия существует, она отменяет ее. Если не существует, добавляет новое свойство с именем «Версия» и значением «3.4.5».
Также вы можете получить все свойства, определенные в .csproj.
var projectRootElement = ProjectRootElement.Open(csprojPath);
foreach (var property in projectRootElement.Properties)
{
Console.WriteLine($"Name: {property.Name} - Value: {property.Value}");
}
Протестировано в .NetCore 5.0
На данный момент довольно сложно ответить на этот вопрос, поскольку мы не знаем, чего вы пытаетесь достичь. Какая здесь цель больше? Существуют различные пакеты, такие как
Microsoft.Build,Microsoft.Build.Frameworkи т. д., Но мы не узнаем, будут ли они вам полезны, если не будем знать, чего вы пытаетесь достичь.