Roslyn Source Generator 未在 .net 框架 4.7.2 中生成任何源

Posted

技术标签:

【中文标题】Roslyn Source Generator 未在 .net 框架 4.7.2 中生成任何源【英文标题】:Roslyn Source Generator not generating any source in a .net framework 4.7.2 【发布时间】:2020-12-17 09:40:22 【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

.NET 5 是 .NET Core 5。出于营销目的,删除了 Core 部分以避免“混淆客户”。尽管市场营销谈论统一,但实际上是弃用 .NET Old,将任何将要迁移到 .NET Core 的 API 移至 .NET Core 并将其重命名为 .NET 5 这意味着 .NET Old 生成器不应该在 .NET Old 项目中可用,因为它们使用的是旧版 SDK 所以基本上你是说 roslyn 的东西在我们升级到 .net 5 之前永远不会工作? 你认为有办法在 dll 中生成可以导入到 .net 旧应用程序中的代码吗? 【参考方案1】:

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

请务必查看说明书的 Breaking changes 部分,以解决预览版和发布版之间的任何 API 差异。


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

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

【讨论】:

我将 OP 的示例代码复制到我的项目中,但它也无法为我构建。我在我的 csproj 文件中将 LangVersion 设置为 preview,但我无法让任何生成器“运行”。 @Dave preview 标志不再需要运行生成器。您可以查看构建日志并确保您的生成器正在通过 /analyzers: 标志传递给 csc。【参考方案2】:

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


旧答案:

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

    使用T4 模板 添加pre-build event 使用像 Clarius.TransformOnBuild 这样的 NuGet 包

【讨论】:

源代码生成器的下一个版本将不再与语言版本有严格的联系,此时在 .NET Framework 中使用的唯一要求将是拥有足够新的编译器来运行源代码生成器。 正如@SamHarwell 所说,这不是真的。我们目前要求用户通过预览语言版本选择使用生成器,但此限制将在发布时解除。 @ChrisSienkiewicz 呵呵,不知道。是否有机会记录在某个地方而我只是错过了它?

以上是关于Roslyn Source Generator 未在 .net 框架 4.7.2 中生成任何源的主要内容,如果未能解决你的问题,请参考以下文章

Source Generator实战

Source Generator-扩充原有代码

Source Generator初探

Source Generator 单元测试

确定是不是使用 Roslyn 读取私有字段

Source Generator-添加诊断