标签: roslyn-code-analysis

VS 2022:Roslyn 代码分析的高 RAM 和 CPU 问题

我们在 Visual Studio 2022(v.17.2.2 64 位)中拥有一个庞大的解决方案(ASP.NET MVC、C#)。

Roslyn 代码分析始终使用高 CPU 和 RAM。有办法防止这个问题吗?配置还是其他?

任务管理器

visual-studio roslyn-code-analysis visual-studio-2022

56
推荐指数
2
解决办法
2万
查看次数

在.NET核心项目上启用Microsoft的代码分析

我们的团队使用自定义规则集的代码分析功能,如果我们忘记对方法参数执行null检查,则会导致构建失败.

但是,现在我们创建一个新的.NET Core项目时,它看起来并不像Code Analysis这些新项目的功能."项目属性"区域中没有用户界面,并且按照此处的建议向项目添加自定义规则集只会影响StyleCop Analyzers(SAxxxx规则).

有没有办法CAxxxx在.NET Core项目中启用Code Analysis()规则?

c# code-analysis roslyn-code-analysis

28
推荐指数
1
解决办法
1万
查看次数

VS项目引用破坏了GUID的大小写敏感性

自从升级到VS 2015以来,我的团队经历了随机古怪的事情,我肯定现在正在微软解决这个问题.一个非常讨厌的问题是我们似乎失去了项目引用,特别是在分支之后.我昨天开始研究我们解决方案的一个新分支,但发现这些类型无法识别,并且名称空间使用被引用为不必要的(因为它们是针对突然变得无法识别的类型).

项目中的引用没有显示任何指示引用问题的图标,但只是为了查看它是否可行,我删除并重新添加了项目引用,这导致其类型再次被识别.

当然,这更新了项目文件,因此我查看了已经进行了哪些更改.无法检测引用的项目与现在可以检测到的项目之间的唯一区别是GUID中的字母字符已从小写更改为大写.例如:

旧的,破碎的参考:

<ProjectReference Include="path/redacted">
    <Project>{95d34b2e-2ceb-499e-ab9e-b644b0af710d}</Project>
    <Name>Project.Name.Redacted</Name>
</ProjectReference>
Run Code Online (Sandbox Code Playgroud)

新的固定参考:

<ProjectReference Include="path/redacted">
    <Project>{95D34B2E-2CEB-499E-AB9E-B644B0AF710D}</Project>
    <Name>Project.Name.Redacted</Name>
</ProjectReference>
Run Code Online (Sandbox Code Playgroud)

我正在寻找发生这种情况的原因以及我如何解决它而无需手动删除和重新添加所有地方的引用(并且无需将所有项目文件GUID转换为大写).

我应该注意,这些"损坏的"引用并没有破坏构建,并且它们只在错误列表中显示为IntelliSense错误,而不是构建错误.所以,引用并没有真正被打破,它们刚刚破坏了IntelliSense(可以说更糟糕了?!).

c# intellisense visual-studio visual-studio-2015 roslyn-code-analysis

26
推荐指数
3
解决办法
3359
查看次数

CSharpAddImportCodeFixProvider遇到错误并已被禁用

我让我的电脑重新为我拍照.我的计算机上安装了Visual Studio版本14.0.25123.00 Update 2.当我尝试使用VS intellisense引用另一个项目时,我收到此错误.

CSharpAddImportCodeFixProvider遇到错误并已被禁用

我有两个项目.其中一个使用命名空间ProjectName.Web.而另一个项目正在使用ProjectName.Web.Controllers.当我引用时ProjectName.Web.Controllers,提供程序崩溃,我相信因为它被设置为项目.知道如何解决这个问题吗?

c# visual-studio roslyn-code-analysis visual-studio-2017

18
推荐指数
1
解决办法
7521
查看次数

何时使用“静默”代码分析严重性?

分析器反馈严重性级别在文档中进行了解释。但在我看来 silentnone严重性级别似乎都有相同的含义 - “我不希望检查此规则”:

为了none

完全被压制了。

为了silent

对用户不可见。但是,诊断结果会报告给 IDE 诊断引擎。

VS2019“向IDE报告”到底有什么效果,在什么场景下应该更silent喜欢none

code-analysis visual-studio roslyn-code-analysis

18
推荐指数
3
解决办法
2741
查看次数

项目文件中的“EnforceExtendedAnalyzerRules”标志有什么作用

在使用 Roslyn 分析器工作期间,我收到了来自 Roslyn 分析器的警报,该警报检查 Roslyn API 的正确使用情况。

RS1036:指定分析器禁止 API 强制设置。

包含分析器或源生成器的项目应指定属性“<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>”。

我尝试用谷歌搜索该属性的用途,但没有找到任何其他信息。这是我已经检查过的链接:

https://github.com/dotnet/roslyn-analyzers/blob/main/src/Microsoft.CodeAnalysis.Analyzers/Microsoft.CodeAnalysis.Analyzers.md#rs1036-specify-analyzer-banned-api-enforcement-setting

你知道这面旗帜有什么作用吗?

csproj roslyn roslyn-code-analysis

16
推荐指数
1
解决办法
5071
查看次数

何时使用SemanticModel.GetSymbolInfo以及何时使用SemanticModel.GetDeclaredSymbol

在某些情况下,当我试图为我的语法节点获取ISymbol时,我在使用SemanticModel.GetSymbolInfo时失败(变为null)但在使用SemanticModel.GetDeclaredSymbol时成功.

我附上了一个例子.

所以我的问题是何时使用每种方法来获取语义模型?

public class Class1
{
    public System.String MyString { get; set; }

    public static void Main()
    {
        var str =
            @"
            namespace ClassLibrary31
            {
                public class Class1
                {
                    public System.String MyString { get; set; }
                }
            }";

        var syntaxTree = SyntaxFactory.ParseSyntaxTree(str);

        MetadataReference[] metadataReferenceReferences = new MetadataReference[]
        {
            MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
        };

        var compilation =
            CSharpCompilation
                .Create("TraceFluent",
                    new[] {syntaxTree},
                    options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, warningLevel:1),
                    references: metadataReferenceReferences
                );

        var temp = compilation.Emit("temp");
        var semanticModel = compilation.GetSemanticModel(syntaxTree, true);

        PropertyDeclarationSyntax propertySyntaxNode = 
            syntaxTree.GetRoot()
                .DescendantNodes()
                .OfType<PropertyDeclarationSyntax>() …
Run Code Online (Sandbox Code Playgroud)

c# roslyn roslyn-code-analysis

13
推荐指数
1
解决办法
1832
查看次数

Roslyn代码分析器 - 何时应该使用"this."?

在使用实例成员时,我总是明确地使用我的代码,在它们前面this.加上静态成员,并在前面添加类型名称.

罗斯林似乎不喜欢这一点,并礼貌地建议你可以省略this.,并Type.从你的代码在适当情况下...

......所以我会这样做... (没有双关语意)

public void DoSomethingCool()
{
    this.CallAwesomeMethod();
    CoolCucumber.DoSomethingLessAewsome();
}
Run Code Online (Sandbox Code Playgroud)

... roslyn建议我这样做......

public void DoSomethingCool()
{
    CallAwesomeMethod();
    DoSomethingLessAwesome();
}
Run Code Online (Sandbox Code Playgroud)

...但是当谈到使用扩展方法时,似乎我不能省略this.例如...... 的使用

public int GetTotal()
{
    // This doesn't work    
    return Sum(o => o.Value);

    // This does
    return this.Sum(o => o.Value);
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 为什么罗斯林似乎不喜欢明确使用this.Type.
  2. 为什么我需要明确this.用于扩展方法?
  3. 虽然这个问题没有严格的一部分,我怎么解决不想我用罗斯林之间的差异this.Type.和了StyleCop的分析仪坚持,我使用它们?

.net c# roslyn c#-6.0 roslyn-code-analysis

12
推荐指数
1
解决办法
450
查看次数

使 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
查看次数

为什么我的 C# 分析器不显示消息 (DiagnosticSeverity.Info)

最近开始摆弄 C# 分析器和生成器,我必须发现使用DiagnosticSeverity.Warning或 时报告的诊断显示得很好DiagnosticSeverity.Error,但使用 时则根本不显示DiagnosticSeverity.Info

外部分析器似乎可以很好地报告消息,所以我想知道我做错了什么。

using System.Collections.Immutable;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Diagnostics;

namespace Sssl.Messaging.Analyzers;

[DiagnosticAnalyzer("C#")]
public class DummyAnalyzer : DiagnosticAnalyzer
{
    private static readonly DiagnosticDescriptor TypeFoundDiagnostic = new
        ("SSSL001", "Named Type Found", "Found Named Type {0}", "Info", DiagnosticSeverity.Warning, true);

    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>
        ImmutableArray.Create(TypeFoundDiagnostic);

    public override void Initialize(AnalysisContext context)
    {
        context.EnableConcurrentExecution();
        context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);
        context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.NamedType);
    }

    private static void AnalyzeSymbol(SymbolAnalysisContext context)
    {
        context.ReportDiagnostic(Diagnostic.Create(TypeFoundDiagnostic, Location.None, context.Symbol.Name));
    }
}
Run Code Online (Sandbox Code Playgroud)

c# roslyn-code-analysis

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