问题标签 [csharp-source-generator]

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 回答
718 浏览

c# - 基于其他程序集类生成源码(c#源码生成器)

我想生成一个静态类,该类应该有一个方法,具体取决于特定参考程序集中的其他类。

一个简化的例子:

我想在项目中找到Entity类并在Core项目中生成一个类Persistence,问题是我的Core项目无法访问并且之前已经编译过Persistence。我应该使用反射还是手动读取核心实体?还是有更好的方法来访问项目中的 SyntaxTree Core

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 回答
112 浏览

c# - 内存中的 CSharpCompilation 无法解析属性

我正在尝试使用以下代码片段在内存中运行 C# 源代码生成器:

References设置为编译代码所需的源:

虽然生成器以这种方式运行得很好,但遗憾的是它没有达到预期的效果,因为源生成器依赖于一个属性来知道是否为指定类型生成源。确切的来源如下:

源生成器正确获取属性,但它被解析为ExtendedErrorTypeSymbol结果类型为NotAnAttributeType. 但是,扩展错误类型符号也有一个候选符号,这是我期望它匹配的确切符号。

这让我感到惊讶,因为显然类型是一个属性,并且作为正常编译的一部分运行源代码生成器实际上确实会生成所有正确的类型。这似乎意味着由于此运行的内存性质而发生了一些奇怪的事情。

据我所知,我的清单References涵盖了正确认识到某物是属性(、、、和)所需mscorlib的所有内容System.Runtime,尽管可能还缺少另一个?netstandardSystem.CoreMetadataReference

我确实发现了这个 GitHub 问题,它似乎描述了一个非常相似的问题,即使不是相同的问题。

我很想知道我是否在这里做错了什么,是否还有其他我遗漏的参考资料,或者我是否完全遗漏了其他东西。

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 回答
355 浏览

c# - 可以物理访问 Source Generator 创建的文件吗?

是否有任何标准方法/选项,如何安排通过生成Source Generators并添加到构建过程中的文件在项目结构中也是物理可见的(因此开发人员可以查看结果代码,例如通过 VS 解决方案资源管理器窗口)?

我的意思是除了我将代码直接保存到生成器的文件中之外Execute(),我希望这可能会带来其他复杂性(尚未尝试过)。

编辑:

  • 根据这个:https ://github.com/dotnet/roslyn/issues/49249#issuecomment-809807528 ,在生成器执行中不允许 I/O。
  • 根据调试会话(进入生成代码功能),生成的源码至少在临时文件夹中可用,比如C:\Users\user\AppData\Local\Temp\.vsdbgsrc\some-guid\FileNameHint.cs. 不幸的是,标准 VS 导航 (F12) 不起作用(无论调试会话活动如何)。
0 投票
1 回答
167 浏览

c# - 是否可以在.net 中链接源生成器?

我有一个项目,我已经将 INotifyPropertyChanged 实现为源生成器,我希望能够在我的各种以 MVVM 为中心的项目中使用它。

该项目使用将属性应用于部分类中的字段的方法,它将为这些字段生成属性。

然而,我目前的项目是基于 Monogame 并且 UI 框架本身并不支持绑定,所以我想我会使用另一个源生成器来避免反射的解决方案。

不幸的是,在我的 INotifyPropertyChanged 源生成器中生成的属性似乎在我的 MLEM.Ui.Binding 源生成器中不可见。我只得到原始源代码中的属性。

有没有办法让 INotifyPropertyChanged 源生成器首先运行,然后在我的第二个绑定源生成器中使用它生成的源代码?

我尝试过的事情:

  • 按我想要的顺序排列我的项目引用(双向)
  • Setting EmitCompilerGeneratedFiles and CompilerGeneratedFilesOutputPath to a directory (I struggled to exclude the files in obj/Debug/generated so I ended up with duplicate classes)
0 投票
0 回答
29 浏览

.net - CS8032:Roslyn 3.8.0 没有问题,但更高版本有任何问题

最近我在使用 Source Generators 时遇到了烦人的问题。正如标题所示,我创建的生成器在 3.8.0 版本上使用 Roslyn(Microsoft.CodeAnalysis.CSharp 作为全名)时适合目标项目,但甚至会导致使用 3.9.0 的 CS8032 警告。
我知道,此 Roslyn API 的任何版本更改都需要清理所有二进制文件及其相关资源,然后构建新的新关联文件(这种情况下可能只有我的桌面)。此外,我的 .NET SDK 版本为 5.0.302,这表明 Roslyn 3.9.0 适合使用它的项目。

在 MyProject.csproj.nuget.dgspec.json,

至少在我看来,似乎没有人有理由麻烦。那么,谁能告诉我在这种情况下会出现什么问题或会出现什么问题?

0 投票
1 回答
146 浏览

c# - 如何不打包 C# 源代码生成器而不将其上传到 NuGet?

我创建了一个类库并将其上传到 NuGet.org。类库使用 C# 源代码生成器来生成重复代码(例如使用值元组的方法)。

类库在 NuGet.org 上过着幸福的生活,但是不知何故,源生成器项目也被打包和上传,这不是我想要的......

如何防止源生成器项目上传到 NuGet?


.csproj类库的:

.csproj源生成器的: