首页 > 解决方案 > C# 使用 SourceGenerator 和 CSharpCompilation

问题描述

主导问题

可以ISourceGeneratorCSharpCompilation.Create(...)吗?

背景

我创建了一个基于ISourceGenerator. 这个生成器使用我不想自己编写的代码创建一些部分类,并且可以从属性和东西生成。它在 VisualStudio 中运行良好。

我还创建了另一个程序,它生成 C# 代码并用于CSharpCompilation.Create(...)在内存中编译它。

现在我想将两者结合起来,这样后面的程序就可以跳过SourceGenerator在编译代码时会生成的部分。

我知道 SourceGenerators 不稳定,那么这个用例已经实现了吗?

我尝试使用MetadataReference.CreateFromFile(typeof(MyGenerator).Assembly.Location)并喂它,CSharpCompilation.Create(references: x)但它没有用 =/

我知道分析器有一个扩展方法WithAnalyzers,但分析器的工作方式不同......

标签: c#roslynroslyn-code-analysis

解决方案


有一个可以使用的 GeneratorDriver API。需要注意的是,在撰写本文时,API 仍被视为测试版并且可能会更改,但我怀疑只要您坚持下面的过程,它应该是好的。

基本上,API 的工作原理是您:

  1. 调用CSharpGeneratorDriver.Create,传入生成器列表。
  2. 调用您在编译中传递的此方法,它会为您提供一个新的编译,其中添加了生成的树。

推荐阅读