C#将SourceGenerator与CSharp编译一起使用

C#将SourceGenerator与CSharp编译一起使用,c#,roslyn,roslyn-code-analysis,C#,Roslyn,Roslyn Code Analysis,引导问题 是否可以将ISourceGenerator与CSharpCompilation.Create(…)一起使用 背景 我基于ISourceGenerator创建了一个Roslyn SourceGenerator。这个生成器使用我不想自己编写的代码创建一些分部类,这些代码可以从属性和其他内容生成。它在VisualStudio中运行良好 我还创建了另一个生成C代码的程序,并使用csharpcomilation.Create(…)在内存中编译它 现在我想将两者结合起来,以便后面的程序可以跳过So

引导问题

是否可以将
ISourceGenerator
CSharpCompilation.Create(…)
一起使用

背景

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

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

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

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

我尝试使用
MetadataReference.CreateFromFile(typeof(MyGenerator.Assembly.Location)
并将其馈送到
csharpcomilation.Create(references:x)
,但它不起作用=/


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

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

API的基本工作原理是:

  • 调用
    CSharpGeneratorDriver.Create
    ,传入生成器列表
  • 在编译中传递的调用,它将为您提供一个新的编译,并添加生成的树

  • 您可以使用GeneratorDriver API。作为一个警告,在撰写本文时,API仍然被认为是测试版,可能会发生变化,但我怀疑,只要您坚持下面的过程,它应该是好的

    API的基本工作原理是:

  • 调用
    CSharpGeneratorDriver.Create
    ,传入生成器列表
  • 在编译中传递的调用,它将为您提供一个新的编译,并添加生成的树

  • 非常感谢。工作得很有魅力。一个重要的细节是,需要使用最新版本的C#解析SyntaxTree以支持SourceGenerators,但是抛出的异常是直接的。谢谢!工作得很有魅力。一个重要的细节是,需要使用最新版本的C#解析SyntaxTree以支持SourceGenerators,但抛出的异常是直接的。