Source Generators(源代码生成器)的调试器支持 | Visual Studio 2019(16.10)新功能试用...

开始之前

Source Generators旨在启用编译时间元编程,即可以在编译时间创建并添加到编译中的代码。

首先用一个Demo为不了解Source Generators的朋友演示一下功能。Source Generators详细说明请参看Source Generators Cookbook[1]

创建一个ClassLibrary1项目(目标框架.NET Standard 2.0)和ClassLibrary2项目(目标框架.NET 5.0)。

ClassLibrary1中编写Source Generators代码,需要引用Microsoft.CodeAnalysis.CSharp包,代码如下:

using Microsoft.CodeAnalysis;

namespace ClassLibrary1
{
    [Generator]
    public class CustomGenerator : ISourceGenerator
    {
        public void Initialize(GeneratorInitializationContext context) { }

        public void Execute(GeneratorExecutionContext context)
        {
            context.AnalyzerConfigOptions.GlobalOptions.TryGetValue($"build_property.RootNamespace", out var currentNamespace);
             

            context.AddSource("myGeneratedFile.cs", $@"
using System;
namespace {currentNamespace}
{{
    public class GeneratedClass
    {{
        public static void GeneratedMethod()
        {{
            Console.WriteLine(""公众号“My IO”"");
        }}
    }}
}}");
        }
    }
}

ClassLibrary2引用ClassLibrary1,修改ClassLibrary2项目文件如下图

代码如下:

namespace ClassLibrary2
{
    public class Class1
    {
        public static void Test()
        {
            ClassLibrary2.GeneratedClass.GeneratedMethod(); 
        }
    }
}

编译成功后,可以在GeneratedMethod()上点右键,选择“转到实现”,可以直接看到生成好的源代码。 

调试Source Generators

可以看到,我们的Source Generators代码明明放在ClassLibrary1,为什么生成出的代码命名空间却是ClassLibrary2?如果我们想调试代码生成过程,怎么办?

1.准备工作

首先,需要安装“.NET Compiler Platform SDK”。 

然后,修改ClassLibrary1项目文件如下图: 

最后,打开ClassLibrary1项目属性的“调试”选项卡,你会发现“启动”下拉框会出现一个“Roslyn Component”选项,选中如下图: 

2.开始调试

CustomGenerator.Execute上打上断点,按F5运行,你会发现弹出一个控制台窗口,然后就会命中刚才的断点,现在可以开始调试了。 

结论

在使用中发现一个Bug :如果修改了Source Generators代码,重新编译后,会发现更改并未生效,这时需要关闭Visual Studio重新进入。

个人认为,使用不太方便,要想启用居然还需要手工修改项目文件!编写和调试功能还有待改进。

欢迎关注我的个人公众号”My IO“

参考资料

[1]

Source Generators Cookbook: https://github.com/dotnet/roslyn/blob/main/docs/features/source-generators.cookbook.md

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值