Могу ли я использовать анализатор roslyn из раствора, в котором он определен?

Насколько я понимаю, есть два способа распространять и использовать анализаторы roslyn:

  1. Как плагин Visual Studio
  2. Как пакет Nuget

Я часто обнаруживаю, что хочу наложить определенные ограничения, специфичные для домена, вместе с удобными исправлениями кода. (Например, «Нам нужна отложенная загрузка Entity Framework, поэтому каждое свойство навигации в пространстве имен WidgetFrobber.EntityFrameworkEntities должно быть виртуальным».)

Тривиально написать крошечный анализатор, который не сможет выполнить сборку, если кто-то из моей команды случайно напишет public ICollection<Widget> вместо public virtual ICollection<Widget>, но поскольку этот гипотетический анализатор не предназначен для совместного использования за пределами моей команды (или, фактически, за пределами .sln, который он определен in) Я бы предпочел не распространять плагин и не обновлять пакет nuget всякий раз, когда я обновляю анализатор.

  • References -> Add Reference -> Project позволяет мне ссылаться на типы анализатора, но на самом деле не добавляет его в качестве анализатора.

  • References -> Analyzers -> Add Analyzer -> Browse... ожидает .dll, а не ссылку на проект.

Можно ли сослаться на анализатор Roslyn внутри определяющего его .sln точно так же, как я могу сослаться на другой проект?


person Iain Galloway    schedule 27.07.2016    source источник


Ответы (2)


Вы можете нажать «Добавить анализатор», а затем добавить библиотеку DLL, созданную проектом.

Вы, вероятно, захотите добавить сборку Release (за исключением того, что вы должны быть Release, прежде чем сможете создавать Debug).

person SLaks    schedule 27.07.2016
comment
Ах! Предположительно, если я настрою конфигурацию решения так, чтобы конфигурация Debug строила конфигурацию Release анализатора, и установила зависимости проекта так, чтобы анализатор был собран первым, это должно сработать? - person Iain Galloway; 27.07.2016
comment
@IainGalloway: Да. В качестве альтернативы вы можете отредактировать csproj, чтобы использовать текущую конфигурацию в пути к указанной DLL (хотя VS может перезаписать это при сохранении). - person SLaks; 27.07.2016
comment
Я пробовал этот подход в VS2017, но всегда получаю предупреждение компилятора CS8034: Невозможно загрузить сборку анализатора xxxxxxx.dll: Не удалось загрузить файл или сборку file: ///xxxxxxx.dll или одну из ее зависимостей. Была сделана попытка загрузить программу с неверным форматом. Файл не отсутствует и имеет правильный формат (обычно его можно открыть с помощью ILSpy). У кого-нибудь была такая же проблема? - person Zvonko; 11.06.2017
comment
@Zvonko: Поменяйте анализатор на Any CPU. - person SLaks; 11.06.2017
comment
@SLaks А как мне добавить dll анализатора на уровень решения? Если у меня есть 100 проектов в другом решении, нужно ли добавлять к ним один за другим? - person joe; 06.09.2019

Вот как я это сделал. Добавьте следующий код в .csproj, который анализатор должен анализировать. Похоже, это работает как с новым .csproj в стиле SDK, так и со старой версией.

<ProjectReference Include="..\Path\To\Your\Analyzer\Analyzer.csproj"
    PrivateAssets="all"
    ReferenceOutputAssembly="false"
    OutputItemType="Analyzer"
/>

Кредит на это сообщение в блоге: https://www.meziantou.net/referencing-an-analyzer-from-a-project.htm

person xforever1313    schedule 08.07.2021