C# 将 SourceGenerator 与 CSharpCompilation 结合使用

C# Use SourceGenerator with CSharpCompilation

主要问题

是否可以将 ISourceGeneratorCSharpCompilation.Create(...) 一起使用?

背景

我基于 ISourceGenerator 创建了一个 Roslyn SourceGenerator。这个生成器创建了一些部分 类,其中包含我不想自己编写的代码,可以从属性和内容生成。它在 VisualStudio 中运行良好。

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

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

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

我尝试使用 MetadataReference.CreateFromFile(typeof(MyGenerator).Assembly.Location) 并将其提供给 CSharpCompilation.Create(references: x) 但它没有用 =/

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

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

基本上 API 的工作原理是你:

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