使用c#源代码生成器(IIncrementalGenerator),我可以生成代码到不同的项目? &g



我正在尝试编写一个实现IIncrementalGenerator的源生成器。生成器需要读取一个struct,其中所有属性都是常量,如下所示:

public struct MyStruct
{
public const string Prop1 = "PROP1";
// More properties
}
使用下面的代码,我已经成功地将代码生成到与上面的struct相同的项目中:
[Generator]
public class MyGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
var structs = context.SyntaxProvider
.CreateSyntaxProvider(
(s, _) => s is StructDeclarationSyntax sds,
(c, _) =>
{
return (c.Node is StructDeclarationSyntax sds && sds.Identifier.Text == "MyStruct")
? sds
: null;
}
)
.Where(x => x != null)
.Collect();
context.RegisterSourceOutput(structs, GenerateSource);
}
private void GenerateSource(SourceProductionContext context, ImmutableArray<StructDeclarationSyntax?> structs)
{            
string myCode = // my generated code
context.AddSource($"MyCode.g.cs", myCode);
}
}

现在我想在一个不同的项目中生成额外的代码。对于IncrementalGeneratorInitializationContextSourceProductionContext是否可能?

一些想法:

  • AdditionalTextsProvider的方式去这里吗?
  • 我应该在其他项目中编写一个新的生成器,并尝试访问原始项目中的MyStruct吗?如果有,我该怎么做?

你可能想往相反的方向走。编写源生成器,使其驻留在一个项目中,并扫描项目程序集以及任何引用的程序集。

以这个家伙的项目为例:

https://github.com/martinothamar/Mediator