Intellisense не находит сгенерированный код в указанном проектеC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Intellisense не находит сгенерированный код в указанном проекте

Сообщение Anonymous »

Я работаю над большой базой кода с несколькими связанными проектами, поэтому решил написать несколько генераторов исходного кода для автоматической генерации шаблонного кода. Структура моего проекта выглядит примерно так:

Код: Выделить всё

GeneratorProject (.NET standard 2.0 C# source generators)
^
CoreProject (.NET 8 C# class library)
^
UIProject (.NET 8 Blazor)
GeneratorProject генерирует код в CoreProject, а CoreProject используется UIProject. В CoreProject все работает отлично. Например: GeneratorProject для удобства создает статический класс с именем MyObjects в CoreProject со списком статических объектов, доступных только для чтения. Когда я пишу код в CoreProject, я могу ввести MyObjects., и Intellisense покажет мне список всех статических объектов в MyObjects.
Моя проблема : Если я набираю код в UIProject и набираю MyObjects., такой список предложений не появляется. Предложение даже просто MyObjects не появляется при его вводе. Если я в конечном итоге введу допустимое имя объекта в MyObjects, он распознается и компилируется (нет синтаксических ошибок, а наведение курсора на полностью напечатанное имя показывает его определение как обычно).
Отсутствие этих предложений во время набора текста снижает удобство создания списков статических объектов — список может быть очень длинным, а имена не так-то просто запомнить без ввода предложений. Это всего лишь один пример того, для чего я использую генераторы, чтобы проиллюстрировать проблему.
Как я могу получить предложения Intellisense, которые показывают мне объекты, созданные генераторами исходного кода в UIProject?
Что я пробовал: я могу создавать файлы, сгенерированные компилятором, в CoreProject и игнорировать эти файлы при сборке. Идея возникла здесь при исследовании способа решения этой проблемы: https://github.com/dotnet/roslyn/issues ... 1609304299
Я добавляю это в CoreProject.csproj:

Код: Выделить всё

true
$(ProjectDir)_generated


1701;1702


1701;1702






Это приведет к тому, что все мои сгенерированные файлы появятся в проводнике решений в папке _generated. Благодаря этому предложения по вводу работают в UIProject, но возникает новая проблема: Visual Studio видит две копии каждого сгенерированного файла и показывает ошибку (красную волнистую линию) в каждом месте, где я ссылаюсь на что-то из сгенерированного файла. Все ошибки — CS0229: Неоднозначность между «MyObjects.something» и «MyObjects.something». Программа по-прежнему собирается и работает нормально, поскольку csproj указывает, что все в папке _generated исключается из сборки, поэтому собираются только настоящие файлы генератора. Но большинство файлов теперь повсюду имеют ложноположительные ошибки, которые в списке ошибок Visual Studio неотличимы от реальных ошибок, что будет недопустимо при работе с более крупной командой. Однако, если есть способ подавить CS0229 в Visual Studio, это достаточно решит мою проблему, и я смогу с ней работать.
У меня есть еще кое-что пробовал: Я возился с подключением GeneratorProject непосредственно к UIProject вместе с CoreProject. Таким образом, я буду создавать сгенерированный код как в CoreProject, так и в UIProject. Генераторы будут работать точно так же, как сейчас для CoreProject. Но я бы добавил в генераторы код, чтобы определить, есть ли в текущем проекте ссылка на сборку, которая ссылается на GeneratorProject. Если да, то он, по сути, будет генерировать те же файлы, что и для CoreProject, но сгенерированные файлы для UIProject будут просто ссылаться на файлы в CoreProject. Пример:
Генератор создает этот файл в CoreProject:

Код: Выделить всё

namespace CoreProject.GeneratorOutput;

public static class MyObjects
{
public static readonly SomeObject something = new("this is an example");
}
Когда генератор работает на UIProject, он проверяет, ссылается ли UIProject на проект, который ссылается на GeneratorProject. Да, он находит CoreProject. В генераторе я бы знал, что этот генератор создал для CoreProject. Итак, для UIProject будет создано что-то вроде этого:

Код: Выделить всё

namespace UIProject.GeneratorOutput;

public static class MyObjects
{
public SomeObject something => CoreProject.GeneratorOutput.MyObjects.something;
}
Подобный шаблон может работать для статических классов, которые представляют собой просто список статических объектов, подобных этому, хотя код генератора должен был бы стать немного уродливее. Однако этот пример MyObjects — это только один из имеющихся у меня вариантов использования генератора: у меня есть другие генераторы, которые выполняют такие функции, как генерация свойств нестатических объектов. Для них этот шаблон не подойдет — мне пришлось бы сделать что-то вроде создания класса, который наследуется от класса CoreProject, и немного изменить имена свойств, что было бы очень некрасиво и непригодно для использования.
Итог: Кто-нибудь сталкивался с этой проблемой раньше и знает обходной путь или исправление?
Для технических подробностей: я использую Visual Studio 2022 Enterprise версии 17.9.5, мои основные проекты и проекты пользовательского интерфейса написаны на C# и .NET 8, а мой проект генератора использует Microsoft.CodeAnalysis.CSharp версии 4.6.0. Я был бы рад предоставить дополнительную информацию, если это поможет!
РЕДАКТИРОВАТЬ
Я создал минимальную копию. если эта проблема: https://github.com/mpagliaro98/IntellisenseTest
В этом примере GeneratorProject создает статический класс в CoreProject с пространством имен CoreProject.GeneratorOutput. Проблему можно продемонстрировать на Home.razor (UIProject > Компоненты > Страницы > Home.razor). Вы можете ввести полный текст MyObjects.something, и как только он будет полностью введен, Visual Studio его распознает. Но пока вы печатаете, конечный результат вообще не отображается в текстовых предложениях. Но ввод CoreClass.SomeFunction(), который не был создан генератором, прекрасно отображается в предложениях. Вы также можете продемонстрировать это в UIProject > UIProjectClass.cs, который просто показывает проблему в обычном файле CS, а не в файле Razor. CoreProject > CoreClass.cs также показывает, что это не проблема в проекте, в котором находится сгенерированный код — ввод MyObjects. дает правильные рекомендации.
Я поставил блок закомментированного кода в CoreProject.csproj и отмены комментариев, которые покажут, что я пытался сделать в разделе «что я пробовал». Предложения по вводу будут корректно работать в UIProject без комментариев, но теперь Visual Studio будет считать, что есть дубликаты каждого сгенерированного объекта, и отображать синтаксические ошибки, даже если все компилируется. Возможно, вам придется очистить, затем собрать и перезапустить Visual Studio, чтобы увидеть синтаксические ошибки, связанные с тем, как Visual Studio кэширует генераторы и их выходные данные.

Подробнее здесь: https://stackoverflow.com/questions/783 ... ed-project
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»