Roslyn源代码生成器在.NET Framework 4.7.2中未生成任何源代码。

4

可能是一个简单的学习问题,但我正在尝试使用新的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 v3.7.0(以及相关的 Roslyn 东西)。

如果我针对 .NET Core,这似乎是我能做到的最简单的方式,而且它似乎可以正常工作,只是当我尝试将它添加到框架项目中时,它什么也不做。没有错误,没有输出消息,只是没有运行或生成源代码。

任何帮助将不胜感激。


.NET 5 是 .NET Core 5。Core 部分被移除是为了避免“混淆客户”的营销目的。尽管有关统一性的营销宣传,实际上是通过将任何可能迁移到 .NET Core 的 API 移动并将其重命名为 .NET 5 来废弃 .NET Old。 - Panagiotis Kanavos
这意味着.NET旧生成器不应该在.NET旧项目中可用,因为它们使用较旧的SDK。 - Panagiotis Kanavos
所以基本上你的意思是说,除非我们升级到 .net 5,否则 roslyn 的东西永远不会起作用? - WhiteleyJ
你认为有没有办法生成一个可以导入到 .net 旧应用程序中的 dll 代码? - WhiteleyJ
2个回答

6
更新:截至Roslyn 3.8 / Visual Studio 16.8,源代码生成器不再受预览标志的限制,可以在任何语言版本或目标框架中使用。
请确保查看菜谱中的重大更改部分,解决预览版和发布版之间的任何API差异。
当前源代码生成器被限制在<langversion>preview</langversion>后面,因为它们还没有作为一个发布功能,我们不希望客户在没有意识到的情况下意外地使用它们。~~ 发布时,我们将删除语言版本限制,并且它们将适用于任何支持的Roslyn编译器,尽管对于用户选择的项目选项,生成器的作者需要确保他们所生成的代码是正确的。

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

0

感谢Chris Sienkiewicz的编辑:目前源代码生成器仅适用于预览语言版本,因此无法在除.NET 5之外的其他.NET版本中使用。但是,一旦源代码生成器发布并稳定后,情况将会改变。


旧答案:

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

  1. 使用 T4 模板
  2. 添加 预构建事件
  3. 使用 NuGet 包,例如 Clarius.TransformOnBuild

下一个版本的源代码生成器将不再与语言版本严格绑定,此时在.NET Framework中使用的唯一要求是具有足够新的编译器来运行源代码生成器。 - Sam Harwell
正如@SamHarwell所说,这是不正确的。目前我们要求用户通过预览语言版本选择生成器,但这个限制将在发布时取消。 - Chris Sienkiewicz
@ChrisSienkiewicz 哦,我不知道。那个有文档记录吗?或者是我错过了? - MindSwipe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接