Source Generators(源代码生成器)的调试器支持 | Visual Studio 2019(16.10)新功能试用...
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Source Generators(源代码生成器)的调试器支持 | Visual Studio 2019(16.10)新功能试用...的主要内容,如果未能解决你的问题,请参考以下文章
Source Generators实现简版AutoMapper
究竟是什么可以比反射还快实现动态调用?| Source Generators版