Я пишу свои первые анализаторы Roslyn. Я в основном следовал руководству https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/special-issue/csharp-and-visual-basic-use-roslyn-to-write-a-live-code-analyzer- для вашего API, а затем добавил второй класс анализатора, который должен быть анализом, не зависящим от языка, подобно тому, что представлено в https://www.meziantou.net/writing-a-language-agnostic-roslyn-analyzer-using-ioperation.htm.
Итак, у меня есть один класс анализатора, который инициализирует себя с помощью
context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.NamedType);
и второй, который использует
context.RegisterOperationAction(AnalyzeConversionOperation, OperationKind.Conversion);
context.RegisterOperationAction(AnalyzeInvocationOperation, OperationKind.Invocation);
Чтобы протестировать мои анализаторы, я установил сгенерированный проект .Vsix в качестве запускаемого проекта, и, нажав F5, я перехожу к отдельному экземпляру Visual Studio, где я пишу код и хочу посмотреть, работают ли мои анализаторы должным образом. И я устанавливаю точки останова в начале действий моего анализатора — AnalyzeSymbol, AnalyzeConversionOperation и AnalyzeInvocationOperation в исходном экземпляре VS.
Действия анализатора вызываются не так, как я ожидал. На самом деле они вообще не вызываются, так как я пишу код для анализа. Только если я ставлю курсор на какое-то имя типа (которое связано с действием SymbolKind.NamedType), и нажимаю на появившуюся лампочку, получаю вызовы - и не только на действие AnalyzeSymbol, но и AnalyzeConversionOperation и AnalyzeInvocationOperation вызываются по мере необходимости для различных операций в коде.
Итак, все действия, которые вызываются, в порядке, но они не вызываются, когда я этого хочу. Я ожидаю, что они будут вызываться по мере необходимости - в основном почти постоянно, когда я редактирую код. Или, по крайней мере, при сборке или какой-либо явной команде «Анализировать сейчас». Но я не знаю ничего подобного. Единственный способ, который я нашел, чтобы вызвать их, - это способ, который я описал. Это не кажется мне правильным.
Я пытался погуглить, но не смог найти решение; или возможно у меня какое-то неправильное представление, и он должен работать по-другому?
Анализаторы закончились. Поэтому я думаю, что ожидается, что вы не столкнетесь с точками останова, но на самом деле сработают эти строки.
У вас есть три варианта:
Отключить запущенные вне процесса анализаторы.
Прикрепите процесс ServiceHub.RoslynCodeAnalysisService
к отладчику.
Отладка с помощью модульного теста. Это мой предпочтительный подход.
Без отладчика, как вы узнали, что обратные вызовы не вызываются. Вы сообщаете о диагностике, которую не видите при вводе? Было бы полезнее, если бы вы предоставили репродукционный проект.
Проблемы возникают уже с проектом, с которого я начал, то есть docs.microsoft.com/en-us/archive/msdn-magazine/2014/…. Мои дальнейшие модификации проекта только делают более очевидным то, что происходит. Без отладчика я вижу, что анализатор не выдает никаких предупреждений, пока я не сделаю описанные «специальные» шаги пользовательского интерфейса. С отладчиком эффекты в VS такие же, и я вижу, что "действие" анализатора тоже только вызывается в этот момент.
Я нашел проблему. В конце концов, я принимаю этот ответ, потому что он правильный, за исключением того, что в нем не упоминались некоторые важные «глюки», которые меня так сильно сбивали с толку: 1) По крайней мере, в VS2022 поведение по умолчанию отличается от того, что указано в статье Microsoft. Я сослался на описание: запуск анализаторов вне процесса — это поведение по умолчанию, поэтому без его отключения отладка, описанная в статье, работает плохо. Но, что более важно, 2) если анализаторы настроены на запуск в отдельном процессе, они ВСЕ ЕЩЕ иногда запускаются в процессе Visual Studio. Они работают в контексте
... по крайней мере, с помощью этой "лампочки". И именно это вызвало путаницу, потому что в анализаторах можно ставить точки останова и отладка на этом останавливается — но так как это отладка в процессе VS, то он вызывается не так, как положено, т.е. в основном после каждого изменения кода, влияющего на анализатор.
Спасибо, но я думаю, что вы неправильно поняли. Моя проблема не в отладке. Я могу отлаживать просто отлично. Моя проблема в том, что анализатор не запускается, пока я не выполню действие, описанное в моем вопросе. Они ведут себя так с отладчиком или без него. Та часть, где я описал поведение в отладчике, просто предоставляет больше информации о том, что происходит внутри.