当前位置: 首页 > news >正文

Unity使用代码分析Roslyn Analyzers

一、创建项目(注意这里不要选netstandard2.1会有报错)

在这里插入图片描述

二、NuGet上安装Microsoft.CodeAnalysis.CSharp

在这里插入图片描述

三、实现[Partial]特性标注的类,结构体,record必须要partial关键字修饰

需要继承DiagnosticAnalyzer
注意一定要加特性DiagnosticAnalyzer

using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;namespace CodeAnalysic
{[DiagnosticAnalyzer(LanguageNames.CSharp)]public class PartialAnalyzer : DiagnosticAnalyzer{public override void Initialize(AnalysisContext context){context.EnableConcurrentExecution();context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);// 注册语义分析完成时要执行的回调context.RegisterSyntaxNodeAction(AnalyzeType, SyntaxKind.ClassDeclaration);context.RegisterSyntaxNodeAction(AnalyzeType, SyntaxKind.StructDeclaration);context.RegisterSyntaxNodeAction(AnalyzeType, SyntaxKind.RecordDeclaration);}public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);private static void AnalyzeType(SyntaxNodeAnalysisContext context){//类型声明 的语法树(Syntax Tree)节点的一个基础抽象类var decl = (TypeDeclarationSyntax)context.Node;// 检查是否有 [Partial] 特性bool hasAttr = decl.AttributeLists.SelectMany(a => a.Attributes).Any(attr =>attr.Name.ToString() == "Partial");if (!hasAttr)return;// 检查是否使用 partialbool isPartial = decl.Modifiers.Any(m => m.IsKind(SyntaxKind.PartialKeyword));if (!isPartial){var kind = decl switch{ClassDeclarationSyntax _ => "类",StructDeclarationSyntax _ => "结构体",_ => "record"};var diag = Diagnostic.Create(Rule,decl.Identifier.GetLocation(),kind,decl.Identifier.Text);context.ReportDiagnostic(diag);}}private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(id: "P0001",title: "类型标记了 [Partial],应声明为 partial",messageFormat: "{0} '{1}' 标记了 Partial 特性,但未声明为 partial",category: "Usage",defaultSeverity: DiagnosticSeverity.Error,isEnabledByDefault: true);}
}
public class PartialAttribute: Attribute{}

四、构建 (VS:生成)

在这里插入图片描述

五、将dll拖入Unity

在这里插入图片描述

在这里插入图片描述

六、拖入发现出现报错,需要将Platform勾选全部去掉

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、测试代码

在这里插入图片描述

八、这时发现没有检查效果。需要添加标签RoslynAnalyzer

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

九、如果这里你在开始创建时没有选择netstandard2.1,那么忽略

在这里插入图片描述
右键解决方案=>属性
在这里插入图片描述
重新导入并添加标签RoslynAnalyzer
在这里插入图片描述
在这里插入图片描述

10、最终控制台已经出现效果

在这里插入图片描述

官方文档

http://www.xdnf.cn/news/933139.html

相关文章:

  • 湖北理元理律师事务所视角:企业债务优化的三维平衡之道
  • Python训练打卡Day43
  • 十二.理解Const关键字
  • JS Day04
  • Polarctf2025夏季赛 web java ez_check
  • 进程优先级
  • ffmpeg(五):裁剪与合并命令
  • 二叉树“倒着看”:层次遍历的反向打开方式
  • 分库分表的取舍
  • 禅道18.2集成LDAP
  • mac:大模型系列测试
  • 原型对象(Prototype)详解
  • BeckHoff_FB --> SET_SNB 功能块
  • Pyppeteer企业级爬虫实战:从动态渲染到反反爬突破(2025终极指南)
  • Day 21
  • 华为OD机考-机房布局
  • LLMs基础学习(八)强化学习专题(1)
  • 用 Lazarus IDE 写一个邮件客户端软件,能收发邮件,编写邮件
  • Django知识-视图
  • Go语言--语法基础5--基本数据类型--输入输出(1)
  • 【Go语言基础【17】】切片:一种动态数组
  • 如何利用 OpenCV 进行实时图像处理与对象检测
  • LeetCode - 560. 和为 K 的子数组
  • 持续交付的进化:从DevOps到AI驱动的IT新动能
  • 博图 SCL 编程技巧:灵活实现上升沿与下降沿检测案例分享(上)
  • Bootstrap 5学习教程,从入门到精通,Bootstrap 5 图像形状(Image Shapes)语法知识点及案例代码(8)
  • 基于 Transformer robert的情感分类任务实践总结之三——FGM
  • 从代码学习深度强化学习 - 多臂老虎机 PyTorch版
  • 【深度学习|学习笔记】自监督学习(Self-Supervised Learning, SSL)在遥感领域中的典型应用案例及其在小样本学习中的作用,附代码。
  • LeetCode --- 452周赛