Roslyn Source Generator 不在 .net Framework 4.7.2 中生成任何源

Roslyn Source Generator not generating any source in a .net framework 4.7.2

可能是一个简单的学习问题,但我正在尝试使用新的 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.CodeAnalysis.CSharp v 3.7.0(和相关的 roslyn 东西)

这似乎是我能做到的最简单的事情,如果我以 .net 核心为目标,它似乎可以工作,只是当我试图将它添加到框架项目时,它什么都不做。没有错误,没有输出消息,只是没有 运行 或生成源。

如有任何帮助,我们将不胜感激。

感谢 Chris Sienkiewicz 的编辑: 目前,源代码生成器受限于预览语言版本,因此对于 .NET 5 以外的其他 .NET 版本不可用。然而,这将会改变一旦源代码生成器发布并稳定。


旧答案:

源代码生成器是 .NET (Core) 5/ C# 9 的一项功能,无法使其与 .NET Framework(或 .NET Core != 5)一起使用。如果你需要在编译时生成代码,你有几个选择:

  1. 使用 T4 模板
  2. 添加一个pre-build event
  3. 使用类似 Clarius.TransformOnBuild
  4. 的 NuGet 包

更新:自 Roslyn 3.8 / Visual Studio 16.8 源代码生成器不再支持预览标志,并且应该适用于任何语言版本或目标框架。

确保查看说明书的 Breaking changes 部分以解决预览版和正式版之间的任何 API 差异。


目前源代码生成器在 <langversion>preview</langversion> 之后被关闭,因为它们不是已发布的功能,我们不希望客户在没有意识到的情况下意外使用它们。~~

在发布时,我们将取消语言版本限制,它们将在任何受支持的 Roslyn 编译器上工作,尽管由各个生成器作者来确保他们生成的代码对于项目选项是正确的用户已选择。