问题标签 [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 回答
76 浏览

c# - 有没有办法从消费项目配置源生成器?

我可以通过查找 JSON 文件并使用它来配置源生成器,但是这种方法是有限的并且通常实施起来很慢。

我正在寻找的是消费项目上流利的语法,例如

据我所知,这不存在,但我很乐意被证明不是这样。

我推测的一个 hacky 解决方案是使用另一个源生成器进行流畅配置,然后配置原始源生成器。这可以工作,但会如此复杂,必须有另一种方式。

0 投票
0 回答
103 浏览

c# - Source Generator 仅从第一个 context.AddSource 发出代码

我正在尝试设置一个基于附加文件生成代码的源生成器。

源生成器实际运行,但我的问题是只有第一个: context.AddSource实际发出代码。

当我去时,Solution Explorer -> Dependencies -> Analyzers -> <GeneratorName>我只能看到一个正在生成的文件,在使用调试器查看后,它对应于第一个context.AddSource. 调试时,我实际上可以看到生成器遍历我的foreach循环并调用context.AddSource,但该代码并未添加到编译中。

.csproj我添加的引用项目中(我用正确的路径替换了路径):

并且.csproj生成器是:

这是我的Execute方法:

0 投票
1 回答
387 浏览

c# - 如何使用 .NET 6 修复源代码生成器?

我将 .NET 5.0 应用程序移植到 .NET 6.0,现在我发现源代码生成器失败了。它显示以下错误:

生成器“PermissionGenerator”无法生成源。它不会影响输出,因此可能会出现编译错误。异常类型为“FileNotFoundException”,消息“无法加载文件或程序集”System.Collections.Immutable,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'或其依赖项之一。该系统找不到指定的文件。'

添加<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>到生成器项目文件的属性组并没有真正帮助。它确实添加System.Collection.Immutable.dll到输出文件夹(6.0.21.52210),但我仍然得到同样的错误。

我的生成器是一个 .NET Standard 2.0 项目,使用 .NET 6 可能不再需要它。所以我还尝试将生成器的运行时设置为 .NET 6。这失败并出现另一个错误:

无法从...创建分析器实例... 无法加载文件或程序集“System.Runtime,版本=6.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。该系统找不到指定的文件。

0 投票
0 回答
77 浏览

c# - 如何使用泛型类实现 System.Text.Json 源生成器?

我有一个像这样的通用类:

我想使用新的System.Text.Json 源代码生成器,但它似乎不适用于泛型类。JsonSerializerContext这是该类的派生:

该错误有点奇怪,因为它使所有其他非泛型JsonSerializerContext实现因以下 2 个错误而失败:

还有一个我觉得与我的问题有关的警告:

然后我更改了派生类以删除通用性:

我得到这个错误:

0 投票
0 回答
42 浏览

c# - 在生产构建上下文中未调用增量源生成器

给定一个工作的源代码生成器和一个用于该生成器的工作测试项目。

发电机

测试项目

测试运行没有错误,类型和方法生成正确。但是我绝对讨厌用纯文本编写测试,加上执行这样的测试不会产生测试覆盖率或单元测试用例,所以我想为源生成器编写一个生产测试。按照惯例,我创建了一个.Run.Tests项目并将Rustic.DataEnumGen nuget项目添加为分析器。像这样

这与前一个测试中的代码完全相同,但包装在 aTestFixture而不是控制台应用程序中。所以我用分析器构建项目,这样DataEnumAttribute生成然后添加上面的代码。但是代码不能编译,因为类型DataEnum还是DataEnumAttribute不存在的。

首先我认为我需要 (I) ReferenceOutputAssembly,但这也没有改变任何东西,然后我尝试了删除OutputItemType="Analyzer"和希望这会导致调用分析器的组合;没有任何帮助。

我得出结论,在这个例子中,导入的源代码生成器,在第一个测试用例中使用纯文本编译时工作的相同,在构建项目之前没有执行,因为如果是这种情况,那么类型总是由生成器将在项目中可用,我会Rusic.*.g.csobj/目录中看到一些。事实并非如此。

那么也许生成器没有打包在 nuget 包中?如您所见,分析仪正在打包。也许我也需要IncludeBuildOutput?不,也不工作。

现在我的问题是为什么会这样?IIncrementalGenerator与 相比,导入项目时是否有一些特定的东西,一些特定的属性,我需要注意ISourceGenerator,因为在项目中使用 anISourceGenerator的工作方式完全相同?

还有什么我可以尝试让增量源生成器工作的,还是我应该恢复使用常规源生成器?

对好文章的引用也有帮助,因为实际上找不到文档。工作时我参考了大部分Andrew Lock的源码生成器相关文章,特别是这一篇

我在一周前测试了这个 mit net 6.0.101 和 6.0.2xx 的构建。

0 投票
0 回答
29 浏览

c# - 使用源生成器从 json 模式文件或打开的 api 规范文件生成 C# POCO

我正在尝试了解源生成器的用例。我已阅读 Microsoft 的文档,并试图了解是否可以实现以下目标,

目标:我正在研究 POC,我有 Json 模式文件或打开 api 规范 Json 文件。我想生成反映架构结构的 C# POCO(超过几千个)。我正在使用 NSwag 工具来生成对象。

所以,我的问题是,使用源生成器是一个可行的选择,我在哪里可以找到更详细/完整的示例