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

c# - 有没有办法在.net framework 4 中使用源生成器?

我正在尝试在 .NET 4 项目中使用 StrongInject。但问题是我得到了Package StrongInject 1.2.1 is not compatible with net40。但是,我自己的 roslyn 分析器工作正常,它们的分析器和生成器都针对 netstandard2.0。谷歌搜索没有多大帮助。有人可以澄清一下吗?

在此处输入图像描述

0 投票
1 回答
107 浏览

c# - 从源生成器内部读取属性属性

背景

我正在尝试使用 C# 源代码生成器。这主要是一个实验项目,但目标是创建一个库,以帮助用户使用键值对格式编写日志。在编译时应该有一组预定义的公共键。enum在用户声明 an并用特殊属性装饰它之前,库不会知道这些是什么。成员可以选择用enum声明Type键是什么的附加属性进行修饰(如果该属性不存在,我们假设它是一个字符串)。这是enum我正在使用的 s:

所以,作为一个例子,我们可能有这样的事情:

现在库要做的是创建一个像这样的新方法:

问题

到目前为止,我已经按照我想要的方式完成了所有工作,但是我对读取FieldType. LogMemberAttribute我可以看到是否LogMember存在,并且在调试器中,我可以看到它被设置为intor string,但在代码中我无法弄清楚如何将其拉出并使用它。

源代码 这是我的方法的(简化版本)Execute(注意:我意识到这里有些东西不是最佳的。没关系 - 现在我们只担心从属性中读取):

那么是否有可能获取这些数据?恐怕我对 SyntaxTrees 和诸如此类的东西不是很好,所以似乎我可以做一些事情来给我想要的东西,但我只是不知道那是什么。

0 投票
2 回答
690 浏览

c# - C# 源代码生成器不包括来自项目参考的结果

Edit3:在某些时候,这才开始起作用。不知道为什么。也许这是一个修复的VS错误?

Edit2:查看解决方案资源管理器中的 Analyzers 节点,我发现源生成器在我第一次打开程序时成功运行,然后它停止并且它生成的所有内容在对我的代码进行一些更改后就消失了。

编辑:按照评论的建议调用后Debugger.Launch(),我可以确认生成器代码正在运行,并且源文本看起来与预期的完全一样。但是 IDE 和编译器仍然会出现错误,就好像没有包含结果一样。

我正在尝试设置一个源生成器以从本地项目引用运行,但无法使其实际运行。我的 NUnit 测试通过了,所以我知道实际的生成逻辑很好,但是准系统测试项目在 Visual Studio 中都无法编译并报告错误。我正在使用 Visual Studio 2022 Preview 5.0,以防万一。

0 投票
1 回答
50 浏览

roslyn - 使用 Roslyn 代码分析在引用的程序集中查找符号

需要在所分析的编译的引用程序集中搜索具有指定类名的类型,而不管它所在的命名空间如何。

本质上,我需要一个函数来搜索引用的程序集,就像下面的方法搜索正在分析的编译一样。

有没有办法使用程序集名称加载编译抽象?只要我不必使用反射,我就可以使用粗略的方法……这样我就可以继续使用 ISymbol。

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 投票
2 回答
93 浏览

c# - SourceGenerator:属性 ConstructorArguments 为空

我正在编写一个源生成器,但正在努力获取传递给我的属性的构造函数的参数值。

我将以下内容注入编译:

然后在我的示例应用程序中,我有以下内容:

这编译时没有错误或警告,我成功地找到了所有用我的CmdrMethod属性修饰的方法,但我无法获取传递给属性的值,因为由于某种原因,ConstructorArguments属性的属性为空:

查看 ConstructorArguments 属性如何为空

我误解了这个 API 吗?我究竟做错了什么?

0 投票
1 回答
1025 浏览

c# - .NET 6 的 System.Text.Json 源代码生成不起作用

根据这篇文章,我尝试实现基于源生成的 JSON 序列化:

https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-source-generation?pivots=dotnet-6-0

我的代码如下:

和我的 SerializationContext :

我的System.Text.Json项目中安装了 6.0.0 版本。

但是在运行时,我的类dotnet build中没有生成任何代码。PersonJsonContext我不明白为什么。

有什么线索吗?

0 投票
1 回答
79 浏览

c# - 如何在自定义诊断警告中包含异常详细信息?

我有一个 C# 源代码生成器,如果在生成过程中引发异常,我想报告一个警告。

我可以成功发出带有描述的警告,但是我找不到包含更多详细信息的方法,我在报告的其他警告中看到了这些详细信息。

这是我到目前为止所得到的:

当这被提出时,代码和描述设置正确:

警告在 VS2022 错误列表中正确显示

我想做的是在同一个诊断中包含异常详细信息,以便可以扩展警告,就像我看到的其他一些警告一样:

扩展的 VS2022 错误列表中的警告显示更多详细信息

我尝试在 Diagnostic.Create 期间设置 Properties 属性,但它们没有显示在任何地方。

如何在自定义诊断中包含此更多信息?

0 投票
1 回答
73 浏览

c# - System.Text.Json 源代码生成和 TimeSpan

我正在尝试System.Text.Json与源生成一起使用。不幸的是,我有一个类有一个TimeSpan需要序列化的数据成员。但是,我无法让它与源生成一起使用,因为它总是尝试序列化私有数据成员_ticks。我不知道是否有办法禁用给定类型的源生成并改用用户提供的源生成。我什至试图忽略这些字段,但似乎没有考虑到:

仍然给出以下错误:

'TimeSpan._ticks' 由于其保护级别而无法访问

你知道是否有解决方法吗?

这是生成错误的源生成部分: 这是 TimeSpan 序列化生成源的一部分,导致错误的部分,它是生成Context.TimeSpan.g.cs文件的一部分: