#c# #roslyn
#c# #roslyn
Вопрос:
Возможно, это простая проблема с обучением, но я пытаюсь использовать новые генераторы исходного кода roslyn для автоматической генерации некоторого исходного кода для .net Framework 4.7.2 (цель — mvc, но я буду рад, если это сработает в моем тестовом консольном приложении).
Вот мой код
[Generator]
public class GenerateCommand : ISourceGenerator
{
public const string TestCode = @"
namespace Test
{
public static class Hello
{
public static string World = ""Hi from generated code."";
}
}";
public void Initialize(InitializationContext context) { }
public void Execute(SourceGeneratorContext context)
{
context.AddSource("Hint_Hello_World", SourceText.From(TestCode, Encoding.UTF8));
}
public void Test()
{
var x = Test.Hello.World; // <-- Refuses to build.
}
}
}
Версии пакетов — Microsoft.Анализ кода.CSharp v 3.7.0 (и связанные с ним материалы roslyn)
Кажется, это настолько просто, насколько я могу это сделать, и, похоже, это работает, если я нацелен на .net core, просто когда я пытаюсь добавить его в проект framework, он ничего не делает. Нет ошибок, нет выходных сообщений, просто не запущен или не генерируется исходный код.
Любая помощь была бы оценена.
Комментарии:
1. .NET 5 — это .NET Core 5.
Core
Часть была удалена в маркетинговых целях, чтобы избежать «запутывания клиентов». Несмотря на маркетинговые разговоры об унификации, на самом деле это устаревание .NET Old путем переноса всех API, которые когда-либо собирались перенести в .NET Core, и переименования его в .NET 52. Это означает, что генераторы .NET Old не должны быть доступны в проектах .NET Old, поскольку они используют более старый SDK
3. То есть, по сути, вы говорите, что материал roslyn никогда не будет работать, пока мы не обновимся до .net 5?
4. Как вы думаете, есть ли способ сгенерировать код в dll, который можно импортировать в старое приложение .net?
Ответ №1:
Обновление: Начиная с версии Roslyn 3.8 / Visual Studio 16.8, генераторы исходных текстов больше не имеют флага предварительного просмотра и должны работать для любой языковой версии или целевой платформы.
Убедитесь, что вы ознакомились с разделом «Основные изменения» кулинарной книги, чтобы устранить любые различия в API между предварительным просмотром и выпуском.
В настоящее время генераторы исходного кода закрыты <langversion>preview</langversion>
, поскольку они не являются выпущенной функцией, и мы не хотим, чтобы клиенты случайно использовали их, не осознавая этого. ~~
Во время выпуска мы снимем ограничение языковой версии, и они будут работать на любом поддерживаемом компиляторе Roslyn, хотя отдельные авторы генератора должны будут убедиться, что генерируемый ими код соответствует параметрам проекта, выбранным пользователем.
Комментарии:
1. Я скопировал пример кода OP в свой проект, но он также не может быть собран для меня. Я
LangVersion
установилpreview
значение в своем файле csproj, но я не могу заставить какие-либо генераторы «запускаться».2. @Dave
preview
флаг больше не требуется для запуска генераторов. Вы можете просмотреть журналы сборки и убедиться, что ваш генератор передается через/analyzers:
флаг csc.
Ответ №2:
Редактировать благодаря Крису Сенкевичу: В настоящее время генераторы исходного кода закрыты для предварительной языковой версии и, следовательно, недоступны для других версий .NET, кроме .NET 5. Однако это изменится, как только генераторы исходного кода будут выпущены и станут стабильными.
Старый ответ:
Генераторы исходного кода — это функция .NET (Core) 5 / C # 9, нет способа заставить его работать с .NET Framework (или .NET Core! = 5). Если вам нужно сгенерировать код во время компиляции, у вас есть несколько вариантов:
- Используйте шаблон T4
- Добавьте событие предварительной сборки
- Используйте пакет NuGet, такой как Clarius.TransformOnBuild
Комментарии:
1. Следующая версия генераторов исходного кода больше не будет иметь строгой привязки к языковой версии, и в этот момент единственным требованием для использования в .NET Framework будет наличие компилятора, достаточно нового для запуска генераторов исходного кода.
2. Как сказал @SamHarwell, это неправда. В настоящее время мы требуем, чтобы пользователь подключался к генераторам через предварительную языковую версию, но это ограничение будет снято во время выпуска.
3. @ChrisSienkiewicz ха, не знал этого. Это где-то задокументировано случайно, и я просто пропустил это?