string sln = path;
MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution solution = workspace.OpenSolutionAsync(sln).Result;
foreach (Project pro in solution.Projects)
{
foreach (Document documents in pro.Documents)
{
SyntaxNode rootNode = documents.GetSyntaxRootAsync().Result;
SemanticModel semanticModel = documents.GetSemanticModelAsync().Result;
IEnumerable<ClassDeclarationSyntax> myClasses = rootNode.DescendantNodes().OfType<ClassDeclarationSyntax>();
string pfad = documents.FilePath; .....
Что я хочу сделать, так это загрузить решение, его проекты и документы внутри этих проектов, а затем я хочу получить путь к этим файлам. Первые 2 работают, но документы не загружаются. При выполнении этого кода второй foreach просто полностью пропускается. Отладка показывает, что документы имеют значение null.
Я видел другие проекты, использующие этот тип кода, но он не работает, и у меня нет причин, почему. Точки означают, что кода больше, но эта часть действительно работает, поэтому я просто вырезал ее. Если у кого-то есть подсказка, не могли бы вы добавить в мой код? Очень признателен!
Сделал это, к сожалению, он просто показывает «ноль» для документов и пропускает весь цикл for. Я не думаю, что данные отсутствуют, но я не уверен, как roslyn получает доступ к этим файлам. Глядя на другие проекты, некоторые делают то же самое, но я не могу получить документы:/
Для отладки подпишитесь на MSBuildWorkspace.WorkspaceFailed перед вызовом OpenSolutionAsync; это будет вызвано, если в процессе загрузки MSBuild возникнут ошибки.
Спасибо за совет. Теперь у меня работает много вещей (и я использовал событие отказа рабочей области и т. д.). Ну, много чего было сломано, лол. Разобрался с большинством!
Возможные причины, по которым pro.Documents возвращает значение null, могут быть следующими:
а. Microsoft.Build
б. Microsoft.Build.Utilities.Core
Если ни одно из вышеперечисленных решений не сработало, вы можете попробовать выполнить отладку самостоятельно, используя обработчик событий MSBuildWorkspace.WorkspaceFailed
. Перед вызовом метода OpenSolutionAsync убедитесь, что вы подписались на это событие. Кредиты: Джейсон Малиновски
привет, возможно данные отсутствуют, или пройтись с отладчиком?