好代码是管出来的——.Net中的代码规范工具及使用

上一篇文章好代码是管出来的——C#的代码规范介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来完成代码管理。
  本文主要内容有:

  • Roslyn简介

    • 开发基于Roslyn的代码分析器

    • 常用的基于Roslyn的代码分析器

  • 在.Net Framework项目中使用代码分析器

    • 安装StyleCop Analyser

    • 设置规则

    • 将自定义的规则使用到整个解决方案

    • 修复代码

    • 使用StyleCop.Json

  • 在.Net Core/.Net Standard项目中使用代码分析器

  • 跨IDE的代码规范解决方案

    • 在VS2017中使用EditorConfig

    • 在VS Code中使用代码规范工具

  • 代码重构&CodeMaid

  • 小结

Roslyn简介

  Roslyn是一个开源的C#、VB编译器,它提供了丰富的代码分析API,第三方应用可以基于这些API来开发自己的代码分析工具。Roslyn应用在VS2015及以上版本。

开发基于Roslyn的代码分析器

  Roslyn提供了相关的SDK,可以通过SDK来开发自己的代码分析器:
  1. 首先需要安装.Net Compiler Platform SDK:
  VS2017 15.5之前的版本可以通过下面连接下载并安装:
  https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.NETCompilerPlatformSDK
  VS2017 15.5之后的版本可以通过Visual Studio Installer进行安装:

  640?wx_fmt=png

  2. 创建一个Analyzer with Code Fix的项目:

  640?wx_fmt=png

  3. 分析器代码简介:

  • 代码结构:

  创建的项目中一共有三个子项目,分别是分析器、分析器测试项目以及vsix安装包项目如下图所示:

  640?wx_fmt=png

  其中分析器项目中包含了分析器(Analyzer1Analyzer)、代码修复器(Analyzer1CodeFixProvider)和相关的资源(Resources.resx)。

  • 分析器(Analyzer1Analyzer):

  分析器代码的核心内容是注册一个命名符号处理器(用于处理类名、接口名等),处理器的工作是判断分析的符合(名称)中是否包含小写字符,如果包含那么给出诊断信息(诊断信息定义包含在资源文件中)。

  640?wx_fmt=png

  • 代码修复器:

  将小写字符转换为大写:

  640?wx_fmt=png

  • 代码调试:

  将vsix项目设为启动项目,就可以对分析器进行调试,调试时VS会在沙盘中启动一个新的VS实例,通过这个VS创建一个项目,编写代码时即可看到分析器给出的诊断结果和代码修复:

  640?wx_fmt=png

  诊断信息:

  640?wx_fmt=png

  修复结果:

  640?wx_fmt=png

  查看语法树:

  640?wx_fmt=jpeg

常用的基于Roslyn的代码分析器

  • Microsoft.CodeAnalysis.FxCopAnalyzers:

  FxCop是.Net Framework中用来分析托管代码的应用程序,它主要关注的代码的设计、国际化、可维护性、性能和安全性等方面,并按照这些类别定义了一个规则集:  https://docs.microsoft.com/en-us/visualstudio/code-quality/code-analysis-for-managed-code-warnings
  FxCopAnalyzers安装: https://www.nuget.org/packages/Microsoft.CodeAnalysis.FxCopAnalyzers

  • StyleCop.Analyzers

  StyleCop本身就是一个用于规范代码格式的工具,所以它的规则也是面向代码格式的,如注释、布局、命名、排序、可维护性、可读性等,StyleCop的规则集参考:https://github.com/DotNetAnalyzers/StyleCopAnalyzers/tree/master/documentation
  StyleCop.Analyzers的项目主页:https://github.com/DotNetAnalyzers/StyleCopAnalyzers

  • Codecracker.CSharp:

  Codecracker.CSharp也是以个开源的代码分析器,它的规则主要是设计、命名、性能、代码风格、代码使用以及重构,具体参见:http://code-cracker.github.io/diagnostics.html
项目主页:https://github.com/code-cracker/code-cracker

  注:Codecracker.CSharp可以通过安装VS拓展工具的方式实现代码分析:https://marketplace.visualstudio.com/items?itemName=GiovanniBassi-MVP.CodeCrackerforC,其它大部分Roslyn分析器需要安装Nuget包。

  • SonarAnalyzer.CSharp:

  SonarAnalyzer.CSharp是一个非常强大的代码分析器,它现阶段一共有343条规范并且主要是面向了代码的使用,包含了缺陷检测、性能、约定、错误处理、事件、异步、测试等等多类规则,规则参见:https://rules.sonarsource.com/csharp
  另外SonarAnalyzer还有针对其它语言的分析器,并且还保持持续更新,项目主页:https://www.sonarsource.com/products/codeanalyzers/sonarcsharp.html

在.Net Framework项目中使用代码分析器

  本文使用StyleCop.Analyzers为例,对项目添加代码分析器。

安装StyleCop Analyzer

  在VS中使用Roslyn的代码分析器时,其中一种方法就是通过Nuget包的方式在每一个项目中添加相应的分析器,下面就以StyleCop Analyzer为例进行介绍:
  通过包管理器安装StyleCop.Analyzers:

  640?wx_fmt=png

  当完成安装后分析器就回对开打的代码文件进行分析,下图是StyleCop Analyzer对默认文件的分析结果:

  640?wx_fmt=png

  同时在项目的References/Analyzers下能看到刚安装的分析器:

  640?wx_fmt=png

设置规则

  每一个分析器都有自己的规则集,但不是每一项规则都适合自己或团队,所以需要对相应的规则集的严重程度,严重程度分别有:None、Hidden、Info、Warning、Error,其中None是忽略规则不检测,Hidden是检测但隐藏错误。
  在VS中对.Net Framework项目的规则设置只需要在Analyzers的右键菜单中选择“Open Active Rule Set”即可:

  640?wx_fmt=png

  然后就会打开一个ruleset文件的编辑窗口,窗口中包含了已生效的规则集合:

  640?wx_fmt=png

  注:除StyleCop Analyzers外,其它是VS中内置的规则集(最小需求规则集),VS内置规则集信息可以选中其中一条规则,然后在属性窗口中查看(包括规则集描述、名称、资源文件、程序集所在路径等等):

  640?wx_fmt=png

  通过ruleset编辑窗口可以简单的通过勾选、设置严重程度来编辑规则,当修改完成保存时,会根据项目名称创建一个ruleset文件:

  640?wx_fmt=png

  修改规则严重程度后原有代码会出现一下错误信息:

  640?wx_fmt=jpeg

  同时生成了一个名称为App.ruleset的规则集文件:

  640?wx_fmt=png

将自定义的规则使用到整个解决方案

  上面的方式需要对每一个项目都进行独立配置,不但工作量大,而且容易出错导致不同项目中规则集不一致,为了解决这个问题,需要在一个解决方案中共享同一个规则集文件。
  1. 将已编辑好的规则集文件转移至一个“固定”位置(App.ruleset文件放置在与项目目录平行的目录中):

   640?wx_fmt=png640?wx_fmt=png

  2. 在项目属性窗口中的,"Code Analysis"选项卡中设置项目的规则集,使用放在固定位置的规则集:

  640?wx_fmt=png

  注:需要重复以上操作,将解决方案内所有项目规则集设置。
  3. 开启或关闭全解决方案的代码分析功能:
  一般情况代码分析工具仅对已打开的代码文件,如果需要分析解决方案中的所有代码文件需要在菜单:Tools->Options->Text Editor->C#->Advanced下勾选“Enable full solution analysis”:

   640?wx_fmt=png

  当启用全解决方案代码分析时,在不打开任何代码文件的情况下会自动对所有代码进行分析,并给出相应结果:

  640?wx_fmt=png

修复代码

  当代码分析器发现不符合规则时会把相应的信息(包括普通、警告、错误3个不同等级)显示到错误列表窗口中,双击信息即可到达有问题的代码处,通过quickly action对代码进行修复,下图是将using语句放到命名空间下的代码修复:

  640?wx_fmt=jpeg

  注:在修复代码时,修复器提供了3种修复的范围,分别是当前文档、当前项目和解决方案,如果不符合规则的代码遍布解决方案中,那么选择一次修复解决方案会省下非常多的时间。

  640?wx_fmt=png

  修复结果:

  640?wx_fmt=png

  如果遇到无法修复、修复后代码出错的情况,可以对错误进行压制(suppress)

  640?wx_fmt=jpeg

  在源代码中压制:

  640?wx_fmt=png

  使用全局压制文件:

  640?wx_fmt=jpeg  注:压制菜单只会出现在对应代码行最左边的快捷活动标签上:

  没有压制菜单:

   640?wx_fmt=jpeg

  有压制菜单:

  640?wx_fmt=jpeg

使用StyleCop.Json

  StyleCop Analyzers除了支持ruleset文件配置规则外,还支持它自己的StyleCop.Json文件配置,另外StyleCop Analyzers提供的一个自动为代码添加文件头的功能(文件头包含了文件以及修改信息)。
  1. 通过SA1633警告,添加一个StyleCop.Json文件:

   640?wx_fmt=png

  2. 将“build Action”设置为“AdditionalFiles”(注:.Net Standard或者.Net Core中需要选择C# analyzer additional file)

  640?wx_fmt=png

  3. 编辑StyleCop.Json:

  640?wx_fmt=png

  注:配置文件中的智能提示由"$schema"控制,并且可以在打开文件时通过右键菜单重新加载智能提示的schema。

  4. 生成文件头信息:

  640?wx_fmt=png

  5. 通过Nuget Package的形式重用ruleset文件和StyleCop.Json,更多信息查看文档:  https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/Configuration.md 的Sharing configuration among solutions小节。

在.Net Core/.Net Standard项目中使用代码分析器

  在.Net Core项目中使用代码分析器与.Net Framework项目中使用方法相似,但有一些不同的地方。
  1. 首先同样需要对解决方案内的所有项目安装分析器:

  640?wx_fmt=png

  安装后,出现的警告信息:

 640?wx_fmt=jpeg

  2. 修改规则集:
  注:.Net Core项目没有“Open Active Rule Set”菜单,刚开始只能对特定分析器的特定规则设置严重性:

   640?wx_fmt=jpeg

  与此同时,当前项目生成一个以项目名称命名的ruleset文件:

  640?wx_fmt=png

  双击打开该文件时可以使用规则编辑窗口即可对该规则集进行修改:

  640?wx_fmt=png

  注:目前为止VS对.Net Core项目的代码分析支持有些细节尚未完善,本例使用VS17 15.7.3版本进行演示,一些版本相对较老的VS版本可能会出现无法创建ruleset文件(需手动根据项目名称创建):

  640?wx_fmt=jpeg

  或者编辑ruleset文件时无法显示规则内容等情况:

  640?wx_fmt=png

  同时在编辑ruleset文件时,需要将Project选择All,才能看到所有的规则集。
  3. 解决方案共享一个规则集:
  注:VS对于.Net Core类型的项目,在查看其项目属性时,没有Code Analysis选项卡,所以如果要共享规则集,除了先将规则集移动到一个固定位置外,还需要手动在每一个项目文件中添加下面XML片段:

 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"><CodeAnalysisRuleSet>..\RuleSets\My.ruleset</CodeAnalysisRuleSet></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"><CodeAnalysisRuleSet>..\RuleSets\My.ruleset</CodeAnalysisRuleSet></PropertyGroup>


  为项目指定一个相对路径的规则集文件。
  当配置完规则集后,其它使用方法与.Net framework中使用方法一致。

跨IDE的代码规范解决方案

  EditorConfig是一个用于不同编辑器或IDE之间定义、维护代码一致性的项目,它由一个代码定义格式文件和一系列的插件组成,在VS2017中微软引入对EditorConfig的支持。

在VS2017中使用EditorConfig

  为了能够快速的添加、编辑EditorConfig文件,首先可以安装一个名为EditorConfig Language Service的拓展工具,它不仅可以快速创建editorConfig文件,还可以在编辑时提供智能提示:

  640?wx_fmt=png

  创建一个editorConfig文件:

  640?wx_fmt=png

  编辑editorConfig文件:

  640?wx_fmt=png  

  注:修改editorConfig后,需要重启VS后才会生效,不确定是否由于个别环境影响。
  VS中支持editorConfig标准规则(除每行最大长度外)、C#分析规则与.Net分析规则,标准规则主要是用于统一代码布局风格,而C#与.Net分析规则则是充分利用C#与.Net的特性给出的一些最佳实践。相同的内容还可以通过Tools->Options->Text Editor->C#->Code Style中设置:

  640?wx_fmt=png

  下图是字段需要通过this访问这一规则,检测出的错误信息:

  640?wx_fmt=png

在VS Code中使用代码规范工具

  VS Code是一个轻量级的跨平台编辑器,使用VS Code开发.Net Core项目是一个非常不错的选择,并且随着时间VS Code对代码规范工具的支持也在不断完善。

使用Roslyn代码分析器

  当一个项目通过VS配置好相应的规则集时,使用VS Code打开项目并进行编译,如果代码有未修改的代码将会出现以下提示信息:

  640?wx_fmt=jpeg

  相对于VS的主动分析代码来说,VS Code是被动的,需要在编译的时候才能知道有哪些代码有问题,VS Code中对C#开发是由C#组件提供支持的:

  640?wx_fmt=png

  同时该组件也在关注实时检测代码的功能,更多信息参考:https://github.com/OmniSharp/omnisharp-vscode/issues/43

使用EditorConfig

  在VS Code中安装EditorConfig拓展:

  640?wx_fmt=jpeg

  然后就可以在VS中使用EditorConfig规范代码格式,但要注意的是,VS Code中Editor仅支持EditorConfig的标准规则。

CodeMaid&代码重构

  CodeMaid是一个用于清理、简化代码的VS拓展工具,使用CodeMaid可以对代码风格进行设定(包括空行、空格、访问器、文件头,甚至还支持StyleCop的SA1504和SA1502规则),最重要的是CodeMaid可以在保存代码时自动格式化代码:

  640?wx_fmt=png

   CodeMaid的配置(部分):

  640?wx_fmt=png

  代码保存前:

  640?wx_fmt=png

  代码保存后:

  640?wx_fmt=png

  CodeMaid除了可以对代码风格进行自动格式化以外,还对代码的重构提供了一些有用的功能,如对代码内容根据类型(如字段、方法等)进行排序(自动或手动拖拽)。另外还对代码进行了圈复杂度(参考:https://baike.baidu.com/item/%E5%9C%88%E5%A4%8D%E6%9D%82%E5%BA%A6)分析,当圈复杂度越高是,表示代码越难维护。

  640?wx_fmt=png

 


  注:圈复杂度关注于代码的可测试性和维护性,与空间/时间复杂度关注性能的复杂度不同。

小结

  本文主要介绍了.Net中常用的代码规范工具,分别是基于Roslyn的代码分析器、基于VS和EditorConfig的代码规范工具以及Code Maid一类的VS拓展工具。
其中最强大的工具是基于Roslyn的代码分析器,这些分析器除了处理代码风格上的规范还有处理程序性能、安全性等方面的规范,同时如果代码被检测出错误时,代码是无法编译成功的,唯一的缺点是每个项目都要安装相应的代码分析器(注:有一些分析器可以通过VS拓展安装,仅需要安装一次就可以应用到所有项目),但不管是VS还是VS Code都可以使用Roslyn的代码分析器。
  EditorConfig是一个轻量级代码规范工具它除了代码布局规则外还兼顾了语言本身的一些特性,如果只是对代码有简单风格要求,并且使用VS作为开发工具,那么EditorConfig是一项非常好的选择。
  而CodeMaid是一个不同于前两者的工具,它更直接一些,可以在保存时就应用相应的规则。
  合理的使用代码规范工具可以大大的提高代码质量并提高开发效率。 

参考:

  https://docs.microsoft.com/en-us/visualstudio/code-quality/code-analysis-for-managed-code-warnings
  https://docs.microsoft.com/en-us/visualstudio/code-quality/use-roslyn-analyzers
  https://codehollow.com/2016/08/use-code-analyzers-csharp-improve-code-quality/
  https://github.com/dotnet/roslyn
  https://www.c-sharpcorner.com/UploadFile/vendettamit/introducing-stylecop-with-code-analyzer-in-visual-studio-201/
  https://github.com/dotnet/roslyn/wiki/Roslyn%20Overview
  https://blogs.msdn.microsoft.com/devfish/2017/11/09/rigging-up-roslyn-analyzers-in-net-core/
  https://www.guru99.com/cyclomatic-complexity.html
  https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options
  https://msdn.microsoft.com/en-us/library/bb429476(v=vs.80).aspx
  https://docs.microsoft.com/zh-cn/visualstudio/code-quality/how-to-configure-code-analysis-for-a-managed-code-project
  https://msdn.microsoft.com/en-us/library/bb429476(v=vs.80).aspx
  https://www.linkedin.com/pulse/stylecop-analyzer-better-code-optimization-arpit-gupta
  https://github.com/OmniSharp/omnisharp-vscode/issues/43

相关文章:

原文地址https://www.cnblogs.com/selimsong/p/9209254.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P6046-纯粹容器【数学期望,组合数】

正题 题目链接:https://www.luogu.com.cn/problem/P6046 题目大意 nnn个数&#xff0c;每次选择两个相邻的数删除小的那个&#xff0c;求每个数期望存活轮数。 解题思路 相当于一条链每次缩掉一条边&#xff0c;我们发现其实每个点只需要考虑左右第一个比它大的就好了。定义…

探讨.NET Core的未来

本文要点与传统的.NET Framework相比&#xff0c;.NET Core平台具有显著的性能优势。.NET Core在Microsoft平台之外也广为采用&#xff0c;并受益于强大的社区参与。.NET Core在设计上采用以服务器为中心&#xff0c;而非聚焦于Windows。.NET Core开发受益于这种设计。.NET Cor…

【数论】分数拆分

分数拆分 题目大意&#xff1a; 给出一个数k&#xff0c;问满足1/k1/x1/y且x>y的x,y有多少对 原题&#xff1a; 解题思路&#xff1a; 首先1k1x1y\frac{1}{k}\frac{1}{x}\frac{1}{y}k1​x1​y1​,变式为1k−1y1x\frac{1}{k}-\frac{1}{y}\frac{1}{x}k1​−y1​x1​,然后再…

.NET Core Community 第三个千星项目诞生:爬虫 DotnetSpider

DotnetSpider 至力于打造一个轻量化、高效率、易开发、可管理的一体化爬虫框架。它的核心要素是URL调度、基本的网页内容下载器、基于爬虫实体类的爬虫实现模式、常用数据库的支持、多线程的支持、状态的监控、运行日志、网页端管理。DotnetSpider 具有相当高的可定制性&#x…

Wannafly 挑战赛27 题解

Wannafly 挑战赛27 题目连接 https://www.nowcoder.com/acm/contest/215#question A.灰魔法师 题目 题解 考虑到可能的完全平方数只有400400400多个,因此对于每种数,直接暴力枚举所有的完全平方数计算一下就可以了. 代码 #include <iostream> #define int long lon…

【开源】OSharpNS,轻量级.net core快速开发框架发布

OSharpNS简介OSharp Framework with .NetStandard2.0&#xff08;OSharpNS&#xff09;是OSharp的以.NetStandard2.0为目标框架&#xff0c;在AspNetCore的现有组件 Microsoft.Extensions.DependencyInjection&#xff0c;Microsoft.Extensions.Configuration&#xff0c;Micro…

【模拟】字符串展开

字符串展开 题目大意&#xff1a; 一串缩写的字符串&#xff0c;将它缩写前的输出来&#xff08;详情见原题&#xff09; 原题 解题思路&#xff1a; 直接模拟每一个字符即可 代码&#xff1a; #include<cstdio> #include<string> #include<cstring> #…

2018-2019 ACM—ICPC SEERC 题解

2018 - 2019 SEERC 题解 比赛发出来太新了,网上根本就搜不到题解,补题补的太难受了. 在这里分享一篇我自己写的题解,也方便别人补题. 题目链接 http://codeforces.com/gym/101964/attachments/download/7814/seerc-2018.pdf A.Numbers 不留坑,这题不会. B.Broken Watch 题解…

【DP】过桥

过桥 题目大意&#xff1a; 有n个人要过一条桥&#xff0c;每个人都有自己的过桥时间&#xff0c;一条桥同时只能有2个人过&#xff08;过桥时间求较慢的一人&#xff09;&#xff0c;且要有人拿着手电筒才能过&#xff0c;只有一个手电筒&#xff0c;且不能扔手电筒&#xf…

.NET Core完成向RyuJIT的迁移

.NET Core CLR团队宣布&#xff0c;他们的.NET Core平台现在已经是完全基于其下一代即时编译器RyuJIT。有人可能不知道&#xff0c;在.NET Core中&#xff0c;编译器&#xff08;Roslyn&#xff09;会把C#代码编译成CIL&#xff08;公共中间语言&#xff09;字节码。接下来&…

【DP】【BFS】迷之阶梯

迷之阶梯 题目大意&#xff1a; 有n层阶梯&#xff0c;如果上面一层离这一层只有1个单位高度&#xff0c;就可以直接上去&#xff0c;也可以下去一层&#xff0c;当下去k层时&#xff0c;可以向上飞2k{2}^{k}2k个单位高度&#xff0c;当然要找到一个小于等于这个高度的阶梯落…

COMCMS_CORE 起步篇,如何运行和部署

前言&#xff1a;关于最近开源后&#xff0c;不少朋友问&#xff0c;怎么我下载下来&#xff0c;运行不了。或者怎么没有左边菜单。货不对板&#xff1f;还是我吃了数据&#xff1f;感言&#xff1a;开源不容易&#xff0c;更不容易的是&#xff0c;明明毫无保留&#xff0c;还…

UVALive7670 Asa's Chess Problem,上下界费用流,另类解法

Asa’s Chess Problem 先阐述一下带上下界的边怎么建. 带上下界的建图方法 设我要建一条边(u→v)(u\rightarrow v)(u→v),流量上界为upupup,下界为downdowndown,费用为costcostcost.则我需要建两条边. 为保证一定会有downdowndown的流量流过去,我们可以建立一条u→vu \right…

ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

引言在使用asp.net core 进行api开发完成后&#xff0c;书写api说明文档对于程序员来说想必是件很痛苦的事情吧&#xff0c;但文档又必须写&#xff0c;而且文档的格式如果没有具体要求的话&#xff0c;最终完成的文档则完全取决于开发者的心情。或者详细点&#xff0c;或者简单…

.NET Core微服务之基于Exceptionless实现分布式日志记录

一、Exceptionless极简介绍Exceptionless 是一个开源的实时的日志收集框架&#xff0c;它可以应用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web API&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;ASP.NET MVC 等技术开发的应用程序中&#x…

.netcore 整合 log4net

1.背景前两天&#xff0c;曾经的一个同事咨询我&#xff0c;怎样将log4net以中间件的形式整合到core里边去。我不假思索的回答&#xff0c;这种问题应该有人做过吧&#xff0c;他说没有。于是&#xff0c;我去博客园搜了下&#xff0c;发现还真没有&#xff0c;全部都是传统.NE…

Asp.Net Core中利用Seq组件展示结构化日志功能

在一次.Net Core小项目的开发中&#xff0c;掌握的不够深入&#xff0c;对日志记录并没有好好利用&#xff0c;以至于一出现异常问题&#xff0c;都得跑动服务器上查看&#xff0c;那时一度怀疑自己肯定没学好&#xff0c;不然这一块日志不可能需要自己扒服务器日志来查看&…

Apache SkyWalking的架构设计【译文】

Apache SkyWalking提供了一个功能强大并且很轻量级的后端。在此&#xff0c;将介绍为什么采用以下方式来设计它&#xff0c;以及它又是如何工作的。架构图对于APM而言&#xff0c;agent或SDKs仅是如何使用libs的技术细节。手动或自动的形式与架构无关&#xff0c;因此在本文中&…

通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

什么是.NET&#xff1f;什么是.NET Framework?本文将从上往下&#xff0c;循序渐进的介绍一系列相关.NET的概念&#xff0c;先从类型系统开始讲起&#xff0c;我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念&#xff0c;这主要包括&#xff1a;CLS、CTS(CLI)、FCL…

.Net Core小技巧 - Hosted Services + Quartz实现定时任务调度

背景之前一直有朋友问&#xff0c;.Net Core Linux环境有没有类似Windows服务的东西。其实是有的&#xff0c;我了解的方法有两种&#xff1a;#1 创建一个ASP.Net Core的Web项目&#xff08;如Web API&#xff09;&#xff0c;然后通过添加中间件&#xff08;Middleware&#…