问题标签 [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# - C# 9.0 源生成器依赖注入注册不支持异步方法
问题:
尝试实现一个自动依赖注入注册器,我的约定非常严格,所以它会非常有用。
我在注册包含异步方法的类时遇到问题,容器似乎在注册类时针对这些方法。
关于该项目:
- Soruce 生成器是 netstandard2.0
- 模型和可执行文件是 net5.0
- 当方法不是异步时,一切正常
- 实际上并不需要 MetadataReference 我只是想避免针对这些的答案
TL;DL
一些复制错误:
- CS0103 当前上下文中不存在名称“d__0”
- CS0103 当前上下文中不存在名称“TestMethod”
- CS1525 无效的表达式术语 '<'
- CS1002 ; 预期的
编码:
源生成器项目:
模型项目:
可执行文件
更新:
生成的代码:
c# - C# 9.0 源代码生成器 - 忽略具有特定属性的类编译
问题:
我有一个源生成器类,它生成一个包含async
/await
关键字的代码,生成器还编译这个类:
有没有办法忽略那些包含[CompilerGenerated]
属性的类?
更新:
这个问题是这个问题的后续:
问题:
尝试实现一个自动依赖注入注册器,我的约定非常严格,所以它会非常有用。
我在注册包含异步方法的类时遇到问题,容器似乎在注册类时针对这些方法。
关于该项目:
- Soruce 生成器是 netstandard2.0
- 模型和可执行文件是 net5.0
- 当方法不是异步时,一切正常
- 实际上并不需要 MetadataReference 我只是想避免针对这些的答案
TL;DL
一些复制错误:
- CS0103 当前上下文中不存在名称“d__0”
- CS0103 当前上下文中不存在名称“TestMethod”
- CS1525 无效的表达式术语 '<'
- CS1002 ; 预期的
编码:
源生成器项目:
模型项目:
可执行文件
更新:
生成的代码:
c# - 如何使用包含的源生成器发布 .Net 库?
我不知道如何发布一个还包含 Roslyn 源代码生成器的 .Net 库,并让源代码生成器访问主项目的源代码,而无需添加从主项目到生成器的显式引用。
目前,我的源生成器只能看到我的 lib 的源代码,而不是主调用项目的源代码。
这是我设置项目的方式:
User "console" test project -> project dependency on -> My lib -> project dependency on -> My source generator
我的 lib 和我的源代码生成器分布在一起,我希望用户引用该 lib,但也不必担心设置源代码生成器。
c# - Roslyn 分析器:类标记为部分
有没有办法找出类是否partial
在 Roslyn 分析器中?有一个PartialImplementationPart
in IMethodSymbol
,但没有类似的 for INamedTypeSymbol
。
我正在编写一个源生成器,并且我只想在可能的情况下生成类的第二部分(如果第一部分是部分的)。
c# - 是否有从 C# 源代码生成 SyntaxFactory-Statements 的工具,用于在源生成器中生成代码
我在 .net 源代码生成器项目中生成(C#)代码。
代码的结构是使用SyntaxFactory
-Methods/object 模型(来自Microsoft.CodeAnalysis.CSharp
)生成的。
创建正确的 SyntaxFactory 调用序列以发出正确的逻辑是乏味的(并且对于某些语句,很复杂,因为文档相当薄)。编写样板 C# 代码会更容易,并且有某种工具可以解析 C# 代码并为该代码的 SyntaxFactory 调用的正确序列生成等效的语法树。
我在 github 上查看了一些使用源代码生成器的项目(最著名的是来自 Microsoft 的 Orleans),但还没有找到这样的帮助者。
这样的工具存在吗?有人可以指点我吗?
我能想出的最好的工具是它CSharpSyntaxTree.ParseText()
,然后我在调试器中查看树或在树上使用简单的访问者。
谢谢
c# - 如何添加源生成器作为 nuget 参考?
如何将源生成器作为 nuget 包添加到 C# net5 项目?
要将项目添加为源生成器,请执行以下代码:
但是我正在寻找 XMLPackageReference
来添加一个 nuget 包作为源生成器。
c# - Codedom 和 SourceGenerator
我正在尝试构建一个应该利用 Sytem.Codedom 的 SourceGenerator。我的项目文件如下所示:
当我尝试像这样运行代码时:
我没有得到任何生成的源,并且分析器因以下错误而失败:
为什么这会失败?
c# - 如何比较 ISyntaxContextReceiver 中生成的类型
我有一个 .NET 5 源生成器,我正在尝试可靠地检测已标记为特定属性的类,该属性已作为同一生成器的一部分生成。
问题是我找不到合适的方法来比较这些类型 - 我尝试了一系列不同的选项,但没有一个适用于所有场景。
在我的生成器中,我正在生成这样的属性:
在另一个项目中,我引用源生成器,并使用如下属性:
到目前为止,一切都很好。当我添加另一个源生成器时,ISyntaxContextReceiver
在初始化期间使用 an ,我试图检查访问的节点是否具有此属性,这就是我正在努力的地方。
这是我的ISyntaxContextReceiver
:
我知道我可以比较类型的名称(例如,lastDescendantTokenType.Name == "CustomAttribute1"
),但我知道如果另一个具有相同名称的属性存在于不同的命名空间中,它也会选择那个,所以理想情况下,我想要还要比较类型的命名空间。
如何检查当前的 ClassDeclarationSyntax 节点是否具有特定属性(包括属性名称和命名空间的匹配)?
c# - C# 源代码生成器不包括来自项目参考的结果
Edit3:在某些时候,这才开始起作用。不知道为什么。也许这是一个修复的VS错误?
Edit2:查看解决方案资源管理器中的 Analyzers 节点,我发现源生成器在我第一次打开程序时成功运行,然后它停止并且它生成的所有内容在对我的代码进行一些更改后就消失了。
编辑:按照评论的建议调用后Debugger.Launch()
,我可以确认生成器代码正在运行,并且源文本看起来与预期的完全一样。但是 IDE 和编译器仍然会出现错误,就好像没有包含结果一样。
我正在尝试设置一个源生成器以从本地项目引用运行,但无法使其实际运行。我的 NUnit 测试通过了,所以我知道实际的生成逻辑很好,但是准系统测试项目在 Visual Studio 中都无法编译并报告错误。我正在使用 Visual Studio 2022 Preview 5.0,以防万一。
roslyn - 使用 Roslyn 代码分析在引用的程序集中查找符号
我需要在所分析的编译的引用程序集中搜索具有指定类名的类型,而不管它所在的命名空间如何。
本质上,我需要一个函数来搜索引用的程序集,就像下面的方法搜索正在分析的编译一样。
有没有办法使用程序集名称加载编译抽象?只要我不必使用反射,我就可以使用粗略的方法……这样我就可以继续使用 ISymbol。