2

可能是一个简单的学习问题,但我正在尝试使用新的 roslyn 源代码生成器为 .net 框架 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 核心,它似乎可以工作,只是当我试图将它添加到框架项目时它什么都不做。没有错误,没有输出消息,只是没有运行或生成源。

任何帮助,将不胜感激。

4

2 回答 2

5

更新:从 Roslyn 3.8 / Visual Studio 16.8 开始,源生成器不再位于预览标志后面,并且应该适用于任何语言版本或目标框架。

确保查看说明书的重大更改部分,以解决预览版和发布版之间的任何 API 差异。


目前源生成器<langversion>preview</langversion>由于不是已发布的功能而受到限制,我们不希望客户在没有意识到的情况下意外使用它们。~~

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

于 2020-09-14T17:37:42.110 回答
0

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


老答案:

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

  1. 使用T4模板
  2. 添加预构建事件
  3. 使用像Clarius.TransformOnBuild这样的 NuGet 包
于 2020-08-28T13:35:24.440 回答