我正在尝试编写一个 C# 源生成器,它在某些条件下使用GeneratorExecutionContext.ReportDiagnostic. 我的源生成器能够在 Visual Studio 中构建示例项目时成功运行并输出错误。但是,我的错误不会在 Visual Studio 编辑器中显示为绿色/红色波浪线。根据微软的文档,这应该可以通过 Roslyn 分析器实现,但没有具体提及源生成器。不过,由于源生成器被视为 Roslyn 分析器,因此我认为这应该是可能的。我成功地用一个小示例复制了我的问题,该示例由源生成器项目和运行生成器的测试项目组成。作为测试,每当生成器看到不返回 的方法时,它就会报告诊断错误void。我打算让红色波浪线出现在有问题的方法的名称下:
源生成器:
[Generator]
public class SampleGenerator : ISourceGenerator
{
public void Execute(GeneratorExecutionContext context)
{
DataReceiver r = (DataReceiver)context.SyntaxReceiver;
foreach(MethodDeclarationSyntax method in r.Methods)
{
IMethodSymbol symbol = (IMethodSymbol)context.Compilation.GetSemanticModel(method.SyntaxTree).GetDeclaredSymbol(method);
if(symbol.ReturnType.SpecialType != SpecialType.System_Void)
{
context.ReportDiagnostic(Diagnostic.Create(
new DiagnosticDescriptor(
"SG0001",
"Non-void method return type",
"Method {0} returns {1}. All methods must return void.",
"yeet",
DiagnosticSeverity.Error,
true), symbol.Locations.FirstOrDefault(), symbol.Name, symbol.ReturnType.Name));
}
}
context.AddSource("yert", "namespace test { …Run Code Online (Sandbox Code Playgroud) c# visual-studio roslyn roslyn-code-analysis sourcegenerators
我有一个类库项目 First.csproj 和一个文件 ICar.cs:
namespace First
{
public interface ICar
{
string Name { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个空的类库项目 Second.csproj 和分析器(源生成器)项目 Second.Generator.csproj:
我想编写 Second.Generator.csproj MySourceGenerator.cs,它采用 Second.csproj,搜索其所有类库项目引用(本例中为 First.csproj)并实现其所有接口。结果应该是生成的代码:
namespace Second
{
public class Car : First.ICar
{
public string Name { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我无法访问源生成器中引用的项目。我尝试过使用反射:
namespace Second.Generator
{
[Generator]
public class MySourceGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context)
{
}
public void Execute(GeneratorExecutionContext context)
{ …Run Code Online (Sandbox Code Playgroud) 我正在创建一个简单的 Roslyn 源生成器。生成器在调试中似乎运行良好,可以正确生成所需的类。但是,当从解决方案中的另一个项目引用它时,它附近会显示一个红色图标,并带有“忽略”工具提示,并且不会生成任何输出:
生成器代码非常简单:
namespace CompetencesSourceGenerator
{
using Microsoft.CodeAnalysis;
[Generator]
public class CompetenceNamesGenerator: CompetenceGeneratorBase
{
public override void Execute(GeneratorExecutionContext context)
{
context.AddSource(
"CompetenceNames.g.cs",
@"namespace Foo { public class Bar { } }"
);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我检查了以下内容:
Microsoft.CodeAnalysis.CSharp生成器项目中的和Microsoft.CodeAnalysis.Analyzers都是最新的为什么它不起作用?
有什么办法可以禁用特定的 C# 9 源代码生成器吗?或者全部禁用它们?
有问题的包是https://github.com/Husqvik/GraphQlClientGenerator#c-9-source-generator这意味着能够同时用作库和源生成器。但这些是相互排斥的,即在大多数用例中,通过执行代码和通过代码生成来生成代码是没有意义的
我正在研究源生成器,但我遇到依赖项问题:
It will not contribute to the output and compilation errors may occur as a result. Exception was of type 'FileNotFoundException' with message 'Could not load file or assembly 'Flurl.Http, Version=3.0.1.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.'
Run Code Online (Sandbox Code Playgroud)
关于如何将依赖项打包到 nuget 中的信息有很多,但我直接引用分析器项目,如下所示:
<ProjectReference Include="SG.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
Run Code Online (Sandbox Code Playgroud)
在分析器项目中,我添加了<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>所有依赖项,并且所有依赖项都在输出目录中可用,但 VS 没有使用该目录 - 它使用了该目录,AppData\Local\Temp\VBCSCompiler\AnalyzerAssemblyLoader\[...]并且只在那里复制一个 DLL。
可以采取什么措施来实现这一目标?
Edit3:在某个时候,这才开始起作用。不知道为什么。也许是 VS 的一个 bug 被修复了?
Edit2:查看解决方案资源管理器中的分析器节点,我发现当我第一次打开程序时,源生成器成功运行,然后它停止,并且在对代码进行一些更改后,它生成的所有内容都会消失。
immediately after opening solution:
> Analyzers
>> MySourceGenerators
>>> MySourceGenerators.NotifyPropertyChangesGenerator
>>>> _NotifyChangedClass_Notify.cs
after making any edits
> Analyzers
>> MySourceGenerators
>>> MySourceGenerators.NotifyPropertyChangesGenerator
>>>> This generator is not generating files.
Run Code Online (Sandbox Code Playgroud)
编辑:按照注释的建议进行调用后Debugger.Launch(),我可以确认生成器代码正在运行,并且源文本看起来与预期的完全一样。但 IDE 和编译器仍然会给出错误,就好像未包含结果一样。
我正在尝试设置一个源生成器以从本地项目引用运行,但无法让它实际运行。我的 NUnit 测试正在通过,所以我知道实际的生成逻辑很好,但是准系统测试项目既无法编译,又会在 Visual Studio 中报告错误。我正在使用 Visual Studio 2022 Preview 5.0,以防万一。
immediately after opening solution:
> Analyzers
>> MySourceGenerators
>>> MySourceGenerators.NotifyPropertyChangesGenerator
>>>> _NotifyChangedClass_Notify.cs
after making any edits
> Analyzers
>> MySourceGenerators
>>> MySourceGenerators.NotifyPropertyChangesGenerator
>>>> This generator is …Run Code Online (Sandbox Code Playgroud) c# roslyn roslyn-code-analysis sourcegenerators csharp-source-generator
我按照文档创建了一个基本的增量源生成器,它输出用属性标记的类的副本:
// Code found in my project
[Copy]
public class MyClass
{
public int Value { get; set; }
}
// Output from the source generator
public class Copy_MyClass
{
public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
源代码生成本身工作得很好,但在 Visual Studio 2022 中使用它时我遇到了两个问题:
例如,如果我使用Foo[Copy] 属性创建一个新类,然后尝试在代码中引用,Visual Studio 将显示未定义的Copy_Foo错误。Copy_Foo
[Copy]
public class Foo { }
public static class TestCopy
{
public static void Test()
{
Copy_Foo foo = …Run Code Online (Sandbox Code Playgroud) 我创建了一个 C# 源生成器,并想将其发布到 Nuget。
但我遇到了警告/错误,例如:
Some target frameworks declared in the dependencies group of the nuspec and the lib/ref folder do not have exact matches in the other location. Consult the list of actions below: - Add lib or ref assemblies for the netstandard2.0 target frameworkAn instance of analyzer Cosmogenesis.Generator.CosmosGenerator cannot be created from [..]\Cosmogenesis.Generator.dll : Could not load file or assembly 'netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified..(或 …自定义类如何JsonConverter<>与System.Text.Json源生成器一起使用?
我想调用JsonSerializer.Deserialize<MyType[]>()它不会回退到基于反射的实现并使用自定义的MyTypeJsonParser : JsonConverter<MyType>.
编辑澄清:自定义转换器是为 实现的MyType,但 json 包含对象数组MyType。因此,我想创建反JsonSerializerContext序列化对象()array的生成源,使用生成的代码来反序列化一个部分,并使用手动转换器来反序列化一个对象部分。MyTypeMyType[]arrayMyType
旧代码(不使用源生成器)通过将自定义转换器添加到JsonSerializerOptions.Converters.
然而,经过进一步研究,我发现Converters中缺少属性JsonSourceGenerationOptionsAttribute。文档中的表格还说明了JsonConverterAttribute和在序列化优化模式JsonSerializerOptions.Converters下不受支持。因此,目前看来(.NET 6)不可能将自定义转换器与 json 源生成器混合。
文档并不清楚,是否至少可以使用元数据收集JsonConverterAttribute源生成模式。
语境
我能够通过将项目属性/调试启动设置为 Roslyn 组件,然后将目标项目组合设置为我的使用项目之一来调试 VS 2019 中的源生成器:
现在 VS 2022 中似乎缺少此功能,我无法使用具有类似设置的启动配置文件 UI 创建启动配置文件。
问题
如何在 Visual Studio 2022 中调试 Roslyn 源生成器?
debugging visual-studio roslyn sourcegenerators visual-studio-2022