标签: sourcegenerators

使 C# 源生成器报告的诊断错误显示在 Visual Studio 编辑器中

我正在尝试编写一个 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

11
推荐指数
1
解决办法
4733
查看次数

如何访问源生成器中项目引用的程序集?

我有一个类库项目 First.csproj 和一个文件 ICar.cs:

namespace First
{
    public interface ICar
    {
        string Name { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个空的类库项目 Second.csproj 和分析器(源生成器)项目 Second.Generator.csproj:

  1. First.csproj - 没有项目引用
  2. Second.csproj - 引用了 First.csproj 和 Second.Generator.csproj
  3. 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)

c# sourcegenerators

11
推荐指数
1
解决办法
2755
查看次数

Roslyn 源生成器被“忽略”?

我正在创建一个简单的 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)

我检查了以下内容:

  • Generator 项目面向 .NET Standard 2.0
  • 引用项目目标 .NET 6
  • Microsoft.CodeAnalysis.CSharp生成器项目中的和Microsoft.CodeAnalysis.Analyzers都是最新的
  • VS 已更新 (17.4.4)
  • .NET 编译器平台 SDK 已安装

为什么它不起作用?

c# roslyn roslyn-code-analysis sourcegenerators

11
推荐指数
1
解决办法
1667
查看次数

禁用特定的 C# 9 源生成器

有什么办法可以禁用特定的 C# 9 源代码生成器吗?或者全部禁用它们?

有问题的包是https://github.com/Husqvik/GraphQlClientGenerator#c-9-source-generator这意味着能够同时用作库和源生成器。但这些是相互排斥的,即在大多数用例中,通过执行代码和通过代码生成来生成代码是没有意义的

c# c#-9.0 sourcegenerators

9
推荐指数
1
解决办法
320
查看次数

Visual Studio 中未加载源生成器依赖项

我正在研究源生成器,但我遇到依赖项问题:

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。

可以采取什么措施来实现这一目标?

.net c# sourcegenerators

9
推荐指数
2
解决办法
3303
查看次数

C# 源生成器不包括项目参考的结果

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

8
推荐指数
1
解决办法
5578
查看次数

如何使增量源生成器在 Visual Studio 中运行?

我按照文档创建了一个基本的增量源生成器,它输出用属性标记的类的副本:

// 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 中使用它时我遇到了两个问题:

  • 源生成器仅在构建期间执行。
  • 在我重新启动 Visual Studio 之前,Intellisense 不会获取生成的代码。
    • 我可以通过将生成的源文件写入项目目录来解决这个问题,但这并不理想,并且仍然遇到上述问题:直到我尝试构建时更改才会反映出来。

例如,如果我使用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# visual-studio sourcegenerators .net-6.0

8
推荐指数
1
解决办法
2759
查看次数

如何发布依赖于 Nuget 的 C# 源生成器?

我创建了一个 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 framework
  • An 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..(或 …

c# nuget sourcegenerators

7
推荐指数
0
解决办法
1260
查看次数

将 System.Text.Json 源生成器与自定义 JsonConverter 结合使用

自定义类如何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源生成模式。

.net c# system.text.json sourcegenerators .net-6.0

7
推荐指数
1
解决办法
3477
查看次数

如何在 VS 2022 中调试 Roslyn 源生成器?

语境

我能够通过将项目属性/调试启动设置为 Roslyn 组件,然后将目标项目组合设置为我的使用项目之一来调试 VS 2019 中的源生成器:

在此输入图像描述 在此输入图像描述

现在 VS 2022 中似乎缺少此功能,我无法使用具有类似设置的启动配置文件 UI 创建启动配置文件。

问题

如何在 Visual Studio 2022 中调试 Roslyn 源生成器?

debugging visual-studio roslyn sourcegenerators visual-studio-2022

7
推荐指数
1
解决办法
8404
查看次数