C# 源代码生成器依赖于现有 class

C# Source code generator dependent on existing class

我需要生成将从抽象 class 继承的源代码,我已经存在于我的项目中,并且源代码生成器项目本身会编译。但是当编译器抱怨生成的源不识别抽象 class 时,即使它在同一个项目中。我是否需要以某种方式告诉生成器项目对自身具有 运行时间依赖性?

编辑: 我正在使用 Microsoft.CodeAnalysis.CSharp。这是描述站点的代码: https://github.com/alebo611/csharpsourcegenproblem/tree/main/MyGeneratorProject

也就是说,我只想生成一个已经定义的“Vehicle”的子class。如果你 运行 它在 Visual Studio 中,你将得到以下错误:

错误 CS0246 找不到类型或命名空间名称 'Vehicle'(是否缺少 using 指令或程序集引用?)使用者 generated.cs

添加“Using ApplicationContext”没有帮助,它会抱怨找不到上下文。

源代码生成器用于生成新的源代码,然后这些代码将被编译并添加到您的程序集中。这意味着通常只在构建时才需要源代码生成器程序集。因此,当通过 ProjectReference 使用源生成器时,通常使用 OutputItemType="Analyzer"ReferenceOutputAssembly="false":

<ProjectReference Include="SourceGenerator.csproj"
                  OutputItemType="Analyzer"
                  ReferenceOutputAssembly="false" />

但是,在您的示例中,源生成器程序集包含使用程序集所需的类型 Vehicle。这意味着源码生成器程序集必须被消费者引用,所以必须省略ReferenceOutputAssembly参数:

<ProjectReference Include="SourceGenerator.csproj"
                  OutputItemType="Analyzer" />

不幸的是,消费者必须注意发电机的这些细节。幸运的是,通过包使用源代码生成器时情况有所不同。在这种情况下,包作者会注意将构建时所需的程序集存储在包内的 analyzers/dotnet/cs 中,并将运行时所需的程序集存储在 lib/[targetframework].