Код: Выделить всё
GeneratorProject (.NET standard 2.0 C# source generators)
^
CoreProject (.NET 8 C# class library)
^
UIProject (.NET 8 Blazor)
Моя проблема : Если я набираю код в UIProject и набираю MyObjects., такой список предложений не появляется. Предложение даже просто MyObjects не появляется при его вводе. Если я в конечном итоге введу допустимое имя объекта в MyObjects, он распознается и компилируется (нет синтаксических ошибок, а наведение курсора на полностью напечатанное имя показывает его определение как обычно).
Отсутствие этих предложений во время набора текста снижает удобство создания списков статических объектов — список может быть очень длинным, а имена не так-то просто запомнить без ввода предложений. Это всего лишь один пример того, для чего я использую генераторы, чтобы проиллюстрировать проблему.
Как я могу получить предложения Intellisense, которые показывают мне объекты, созданные генераторами исходного кода в UIProject?
Что я пробовал: я могу создавать файлы, сгенерированные компилятором, в CoreProject и игнорировать эти файлы при сборке. Идея возникла здесь при исследовании способа решения этой проблемы: https://github.com/dotnet/roslyn/issues ... 1609304299
Я добавляю это в CoreProject.csproj:
Код: Выделить всё
true
$(ProjectDir)_generated
1701;1702
1701;1702
У меня есть еще кое-что пробовал: Я возился с подключением 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");
}
Код: Выделить всё
namespace UIProject.GeneratorOutput;
public static class MyObjects
{
public SomeObject something => CoreProject.GeneratorOutput.MyObjects.something;
}
Итог: Кто-нибудь сталкивался с этой проблемой раньше и знает обходной путь или исправление?
Для технических подробностей: я использую 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