Roslyn Document of a Project возвращает значение null

            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.

Я видел другие проекты, использующие этот тип кода, но он не работает, и у меня нет причин, почему. Точки означают, что кода больше, но эта часть действительно работает, поэтому я просто вырезал ее. Если у кого-то есть подсказка, не могли бы вы добавить в мой код? Очень признателен!

привет, возможно данные отсутствуют, или пройтись с отладчиком?

IronMan 23.12.2020 00:48

Сделал это, к сожалению, он просто показывает «ноль» для документов и пропускает весь цикл for. Я не думаю, что данные отсутствуют, но я не уверен, как roslyn получает доступ к этим файлам. Глядя на другие проекты, некоторые делают то же самое, но я не могу получить документы:/

Nope 23.12.2020 13:46

Для отладки подпишитесь на MSBuildWorkspace.WorkspaceFailed перед вызовом OpenSolutionAsync; это будет вызвано, если в процессе загрузки MSBuild возникнут ошибки.

Jason Malinowski 08.01.2021 21:13

Спасибо за совет. Теперь у меня работает много вещей (и я использовал событие отказа рабочей области и т. д.). Ну, много чего было сломано, лол. Разобрался с большинством!

Nope 10.01.2021 01:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
274
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможные причины, по которым pro.Documents возвращает значение null, могут быть следующими:

  1. Стандартный проект .NET не поддерживается рабочей областью MSBuild. Для получения дополнительной информации нажмите здесь.
  2. Отсутствующие пакеты Nuget

а. Microsoft.Build

б. Microsoft.Build.Utilities.Core

Если ни одно из вышеперечисленных решений не сработало, вы можете попробовать выполнить отладку самостоятельно, используя обработчик событий MSBuildWorkspace.WorkspaceFailed. Перед вызовом метода OpenSolutionAsync убедитесь, что вы подписались на это событие. Кредиты: Джейсон Малиновски

Другие вопросы по теме