问题标签 [sourcegenerators]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
115 浏览

c# - 源生成器在同一个项目中看不到类

我有一个源生成器,它看起来像这样:

在同一个项目中,我有一个简单类的文件夹,其名称都以“ResponseMessage”结尾。这些类只有简单的类型,如 string、int 和 bool 作为属性。它们与 SourceGenerator 位于不同的命名空间中。

还有第二个控制台应用程序项目将我的源代码生成器引用为分析器。当我构建项目时,我可以成功地闯入 SourceGenerator 代码。

问题:我拥有的 SyntaxReceiver 类永远不会看到简单的 ResponseMessage 类。该OnVisitSyntaxNode方法仅命中 Program.cs 文件。到底是怎么回事?

0 投票
0 回答
29 浏览

c# - c# SourceGenerator 忽略添加到生成代码的 xml 注释

我使用源生成器将成员添加到现有类,类似于AutoNotifyGenerator示例。我在生成的代码中添加了 xml 注释,但它们没有显示在同一个项目的智能感知中或引用包含生成代码的库的其他项目中。它们也不会出现在生成的 xml 文档文件中。

有什么办法不让我生成的 xml 注释被忽略?

0 投票
0 回答
70 浏览

c# - 如何在 C#/ .NET 5 中生成非源文件(例如 json)

我已经开始在 .NET 5 中使用 Source Generator 来生成一些自定义序列化代码。这非常适合我的用例。但是,我还想以 JSON 文件的形式为所述序列化程序创建自定义模式。不幸的是,我还没有找到一种方法来使用源生成器输出生成的文件。这可能吗?或者也许我应该使用其他的生成方法?

0 投票
1 回答
1515 浏览

c# - 无法创建 C# 源代码生成器

我自己和我的同事在过去几周的某个时候都开始看到这个问题:

构建失败

CSC:警告 CS8032:无法从 /Users/work/dev/git/reporting-model/src/My.Company.Generators/bin/Debug/netstandard2.1 创建分析器 My.Company.Generators.ReportingV2Generator 的实例/My.Company.Generators.dll:无法加载文件或程序集“Microsoft.CodeAnalysis,版本=3.10.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”。系统找不到指定的文件.. [/Users/work/dev/git/reporting-model/src/My.Team.Models.ReportingV2/My.Team.Models.ReportingV2.csproj]

/Users/work/dev/git/reporting-model/src/My.Company.Api/SmokeTests/Tests/ContentAskExpertSmokeTest.cs(7,20):错误 CS0234:类型或命名空间名称“模型”不存在于命名空间“My.Team”(您是否缺少程序集参考?) [/Users/work/dev/git/reporting-model/src/My.Company.Api/My.Company.Api.csproj]
... 更多上述“类型或命名空间”错误
...

这发生在 macOS 和 Windows 上。它适用于 Linux(个人机器和内部mcr.microsoft.com/dotnet/sdk:5.0.

从字面上看,源生成器代码/csproj 没有任何变化,它是在两周前自发开始的。我也可以在两个月前的提交中重现这个,所以看起来包中的某些东西可能在外部发生了变化?

0 投票
0 回答
335 浏览

c# - 使用 C#9 Source Generator 时,如何确保文件生成到特定位置/文件路径?

我正在使用 C# 9 的 Source Generator 开发一个项目,但是在生成代码时,我希望将生成的代码的不同文件发送到正在生成代码的现有项目中的特定文件路径/位置。

这可能吗?我知道我可以指定它们都放入的文件夹:

<CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath>

并将“生成”更改为我希望生成的文件位于其中的文件夹。因此,如果我已经有一个名为“Models”的文件夹,我知道我会将“Generated”更改为“Models”,然后将其放在那里。

但是,一旦它位于该文件路径中,它就会被放入具有源生成器项目名称的文件夹中,然后是另一个具有 namespace.generatorclassname 的文件夹中。

所以在这种情况下,我发生的是:

  • 'Generated' 是项目中正在生成文件的指定文件夹路径
  • 'SourceGenerator' 是包含实际生成器的项目的名称
  • “生成器”是实际上是合法生成器的类的名称
  • “CustomerTest”文件是正在生成的实际文件

这是我目前正在发生的上述场景的 屏幕截图:生成的文件夹结构的屏幕截图

但是,如果我希望将这些文件中的每一个都生成到目标项目预先存在的文件夹结构中的不同位置,该怎么办?那可能吗?有任何想法吗?

0 投票
1 回答
251 浏览

c# - 如何在源生成器中访问项目引用的程序集?

我有一个类库项目 First.csproj,其中包含一个文件 ICar.cs:

我有一个空的类库项目 Second.csproj 和分析器(源生成器)项目 Second.Generator.csproj:

  1. First.csproj - 没有项目引用
  2. Second.csproj - 引用了 First.csproj 和 Second.Generator.csproj
  3. Second.Generator.csproj - 没有项目引用

我想编写 Second.Generator.csproj MySourceGenerator.cs,它采用 Second.csproj,搜索其所有类库项目引用(在本例中为 First.csproj)并实现其所有接口。结果应该是这个生成的代码:

问题是我无法访问源生成器中的引用项目。我曾尝试使用反射:

但我无法加载程序集:

无法加载文件或程序集 'file:///...First\bin\Debug\net6.0\ref\First.dll' 或其依赖项之一。不应加载引用程序集以供执行。它们只能在 Reflection-only loader 上下文中加载。

任何帮助将不胜感激。谢谢你。

0 投票
0 回答
47 浏览

c# - 在不同的库中使用相同的 C# 源代码生成器时会出现错误 CS1503

我有这种情况:

  • 相同的 C# 源代码生成器用于两个不同的类库。
  • 另一个 ConsoleApp 引用了这两个类库。
  • 当相同类型(在 ClassLibrary 1中生成)用作在 ClassLibrary 2中采用相同类型的方法的输入参数时,我收到错误 CS1503。有关错误描述,请参见下文:

在此处输入图像描述

两个类库和控制台应用程序的源代码定义如下:

类库 1

类库 2

以及结合了两者的控制台应用程序:

我认为这实际上是合乎逻辑的,因为两个类库都使用相同的 NuGet 包,但是因为它是源生成器,所以生成的类型不同(尽管源代码相同)。

目前我对这个问题有多种想法/解决方案:

  1. 创建一个名为“ClassLibraryCommon”的新类库,它使用 C# Source Generator,并让“ClassLibrary1”和“ClassLibrary2”都使用这个项目。
  2. 使用来自AnyOf NuGet的非 C# 源代码生成器这仅包含已生成的 C# 文件,并且不会对源代码生成做任何事情
  3. ❓ 其他选择?
0 投票
0 回答
58 浏览

syntax - SourceGenerators、Roslyn 和 NormalizeWhitespace

我正在创建一个 Roslyn SourceGenerator,但在格式化 CodeAnalysis CompilationUnitSyntax 实例时遇到问题。

我在 SourceGenerators 中看到的所有示例都使用了一些复杂的 StringBuilders、TextWriters 或字符串格式的模板。

我正在使用 Microsoft.CodeAnalysis.CSharp.Syntax 命名空间来生成我的代码。

我遇到的问题是,如果我在调用“GeneratorExecutionContext.AddSource”之前调用“NormalizeWhitespace”,一些代码会因为缺少更好的术语而被渲染。

我编写了初始化对象的正确代码=>

调用“NormalizeWhitespace”将把它变成

这可以编译,但看起来很丑陋。

如果我不使用 NormalizeWhitespace,一切看起来会更糟,并且生成的代码可能由于修饰符、标识符等之间缺少空格而无法编译。

出于性能原因,我读过的所有内容都建议不要对大量发出的代码使用“NormalizeWhitespace”。

此外,我尝试使用 Roslyn Formatter API,但在 SourceGenerator 内实例化 AdhocWorkspace 实例时遇到问题(TypeLoadException 不断被抛出)。

我宁愿不使用 SyntaxRewriter 或字符串格式,因为这个项目的重点是减少使用魔术字符串。

是否有关于格式化 SyntaxNodes 的明确指南,尤其是关于 NormalizeWhitespace 的使用?

0 投票
1 回答
186 浏览

c# - 如何添加源生成器作为 nuget 参考?

如何将源生成器作为 nuget 包添加到 C# net5 项目?

要将项目添加为源生成器,请执行以下代码:

但是我正在寻找 XMLPackageReference来添加一个 nuget 包作为源生成器。

0 投票
0 回答
188 浏览

msbuild - C# Source Generator 应该刷新/删除发出的文件

我创建了一个源生成器来扩展(部分)满足某些标准的类。为了检查和查看生成的代码,我通过将以下内容添加到我的项目中来启用这些文件的发射:

只要我不进行重构——比如重命名一个类,它就可以工作。因为当我重命名“源”类时,每个类都会生成一个文件但不会删除。

所以我添加了以下代码来清理所有生成的文件(在清理和重建时)

然而,每第二次重建都会失败: Error CS2001 Source file 'xyz.generated.cs' could not be found.

因此,我正在寻找另一种方法来使我生成的源代码保持最新,该项目不仅每次尝试都会编译一次。