问题标签 [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.
c# - 有没有办法从消费项目配置源生成器?
我可以通过查找 JSON 文件并使用它来配置源生成器,但是这种方法是有限的并且通常实施起来很慢。
我正在寻找的是消费项目上流利的语法,例如
据我所知,这不存在,但我很乐意被证明不是这样。
我推测的一个 hacky 解决方案是使用另一个源生成器进行流畅配置,然后配置原始源生成器。这可以工作,但会如此复杂,必须有另一种方式。
c# - Source Generator 仅从第一个 context.AddSource 发出代码
我正在尝试设置一个基于附加文件生成代码的源生成器。
源生成器实际运行,但我的问题是只有第一个:
context.AddSource
实际发出代码。
当我去时,Solution Explorer -> Dependencies -> Analyzers -> <GeneratorName>
我只能看到一个正在生成的文件,在使用调试器查看后,它对应于第一个context.AddSource
. 调试时,我实际上可以看到生成器遍历我的foreach
循环并调用context.AddSource
,但该代码并未添加到编译中。
在.csproj
我添加的引用项目中(我用正确的路径替换了路径):
并且.csproj
生成器是:
这是我的Execute
方法:
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”或其依赖项之一。该系统找不到指定的文件。
c# - 如何使用泛型类实现 System.Text.Json 源生成器?
我有一个像这样的通用类:
我想使用新的System.Text.Json
源代码生成器,但它似乎不适用于泛型类。JsonSerializerContext
这是该类的派生:
该错误有点奇怪,因为它使所有其他非泛型JsonSerializerContext
实现因以下 2 个错误而失败:
还有一个我觉得与我的问题有关的警告:
然后我更改了派生类以删除通用性:
我得到这个错误:
c# - 在生产构建上下文中未调用增量源生成器
给定一个工作的源代码生成器和一个用于该生成器的工作测试项目。
发电机
测试项目
测试运行没有错误,类型和方法生成正确。但是我绝对讨厌用纯文本编写测试,加上执行这样的测试不会产生测试覆盖率或单元测试用例,所以我想为源生成器编写一个生产测试。按照惯例,我创建了一个.Run.Tests
项目并将Rustic.DataEnumGen
nuget项目添加为分析器。像这样
这与前一个测试中的代码完全相同,但包装在 aTestFixture
而不是控制台应用程序中。所以我用分析器构建项目,这样DataEnumAttribute
生成然后添加上面的代码。但是代码不能编译,因为类型DataEnum
还是DataEnumAttribute
不存在的。
首先我认为我需要 (I) ReferenceOutputAssembly
,但这也没有改变任何东西,然后我尝试了删除OutputItemType="Analyzer"
和希望这会导致调用分析器的组合;没有任何帮助。
我得出结论,在这个例子中,导入的源代码生成器,在第一个测试用例中使用纯文本编译时工作的相同,在构建项目之前没有执行,因为如果是这种情况,那么类型总是由生成器将在项目中可用,我会Rusic.*.g.cs
在obj/
目录中看到一些。事实并非如此。
那么也许生成器没有打包在 nuget 包中?如您所见,分析仪正在打包。也许我也需要IncludeBuildOutput
?不,也不工作。
现在我的问题是为什么会这样?IIncrementalGenerator
与 相比,导入项目时是否有一些特定的东西,一些特定的属性,我需要注意ISourceGenerator
,因为在项目中使用 anISourceGenerator
的工作方式完全相同?
还有什么我可以尝试让增量源生成器工作的,还是我应该恢复使用常规源生成器?
对好文章的引用也有帮助,因为实际上找不到文档。工作时我参考了大部分Andrew Lock的源码生成器相关文章,特别是这一篇。
我在一周前测试了这个 mit net 6.0.101 和 6.0.2xx 的构建。
c# - 使用源生成器从 json 模式文件或打开的 api 规范文件生成 C# POCO
我正在尝试了解源生成器的用例。我已阅读 Microsoft 的文档,并试图了解是否可以实现以下目标,
目标:我正在研究 POC,我有 Json 模式文件或打开 api 规范 Json 文件。我想生成反映架构结构的 C# POCO(超过几千个)。我正在使用 NSwag 工具来生成对象。
所以,我的问题是,使用源生成器是一个可行的选择,我在哪里可以找到更详细/完整的示例