ANcpLua/ANcpLua.Analyzers
GitHub: ANcpLua/ANcpLua.Analyzers
这是一个 Roslyn 分析器,用于强制执行 C# 代码的 AOT 安全、最佳实践和质量标准,提升开发可靠性。
Stars: 2 | Forks: 0
[](https://www.nuget.org/packages/ANcpLua.Analyzers/)
[](https://dotnet.microsoft.com/platform/dotnet-standard)
[](LICENSE)
# or with the dot. But in Chinese, we might write it as "ANcpLua 分析器" without the dot. To be consistent with the original format, perhaps keep the dot. But the instruction doesn't specify about punctuation. I'll keep the structure similar.
用于现代 C# 模式、AOT 安全、ASP.NET Core、可靠性、GenAI 工具治理以及 ANcpLua 生态系统惯例的 Roslyn 分析器。
## 安装说明
```
dotnet add package ANcpLua.Analyzers
```
## 您将获得
- **90 项诊断**,涵盖设计、可靠性、用法、Roslyn 工具、ASP.NET Core、AOT、线程、样式、配置、GenAI 和版本管理。
- **38 个自动代码修复**,用于高置信度的转换。
- **CI 友好的强制执行**,通过 `.editorconfig` 严重性配置实现。
## 按类别划分的规则覆盖范围
| 类别 | 规则数量 |
|:---------|------:|
| Roslyn 工具 | 24 |
| AOT 测试 | 10 |
| 可靠性 | 10 |
| ASP.NET Core | 9 |
| 用法 | 9 |
| 版本管理 | 7 |
| 设计 | 6 |
| 线程 | 6 |
| GenAI | 3 |
| 样式 | 5 |
| 配置 | 1 |
## 完整规则目录
| 规则 | 类别 | 严重性 | 分析器 |
|:-----|:---------|:--------:|:---------|
| [AL0001](https://ancplua.mintlify.app/analyzers/rules/AL0001) | 设计 | 错误 | `Al0001ProhibitPrimaryConstructorParameterReassignmentAnalyzer` |
| [AL0002](https://ancplua.mintlify.app/analyzers/rules/AL0002) | 设计 | 警告 | `Al0002DontRepeatNegatedPatternAnalyzer` |
| [AL0003](https://ancplua.mintlify.app/analyzers/rules/AL0003) | 可靠性 | 错误 | `Al0003DontDivideByConstantZeroAnalyzer` |
| [AL0004](https://ancplua.mintlify.app/analyzers/rules/AL0004) | 用法 | 警告 | `Al0004ToAl0005SpanComparisonAnalyzer` |
| [AL0005](https://ancplua.mintlify.app/analyzers/rules/AL0005) | 用法 | 警告 | `Al0004ToAl0005SpanComparisonAnalyzer` |
| [AL0006](https://ancplua.mintlify.app/analyzers/rules/AL0006) | 设计 | 警告 | `Al0006FieldNameConflictWithPrimaryConstructorAnalyzer` |
| [AL0007](https://ancplua.mintlify.app/analyzers/rules/AL0007) | 用法 | 错误 | `Al0007ToAl0009IXmlSerializableAnalyzer` |
| [AL0008](https://ancplua.mintlify.app/analyzers/rules/AL0008) | 用法 | 错误 | `Al0007ToAl0009IXmlSerializableAnalyzer` |
| [AL0009](https://ancplua.mintlify.app/analyzers/rules/AL0009) | 用法 | 错误 | `Al0007ToAl0009IXmlSerializableAnalyzer` |
| [AL0011](https://ancplua.mintlify.app/analyzers/rules/AL0011) | 线程 | 警告 | `Al0011LockKeywordAnalyzer` |
| [AL0014](https://ancplua.mintlify.app/analyzers/rules/AL0014) | 样式 | 警告 | `Al0014PreferPatternMatchingAnalyzer` |
| [AL0015](https://ancplua.mintlify.app/analyzers/rules/AL0015) | 样式 | 信息 | `Al0015NormalizeNullGuardStyleAnalyzer` |
| [AL0016](https://ancplua.mintlify.app/analyzers/rules/AL0016) | 样式 | 信息 | `Al0016CombineDeclarationWithNullCheckAnalyzer` |
| [AL0017](https://ancplua.mintlify.app/analyzers/rules/AL0017) | 版本管理 | 警告 | `Al0017HardcodedPackageVersionAnalyzer` |
| [AL0018](https://ancplua.mintlify.app/analyzers/rules/AL0018) | 版本管理 | 警告 | `Al0018VersionPropsNotImportedAnalyzer` |
| [AL0019](https://ancplua.mintlify.app/analyzers/rules/AL0019) | 版本管理 | 警告 | `Al0019UndefinedVersionVariableAnalyzer` |
| [AL0020](https://ancplua.mintlify.app/analyzers/rules/AL0020) | ASP.NET Core | 错误 | `Al0020ToAl0024FormBindingAnalyzer` |
| [AL0021](https://ancplua.mintlify.app/analyzers/rules/AL0021) | ASP.NET Core | 错误 | `Al0020ToAl0024FormBindingAnalyzer` |
| [AL0022](https://ancplua.mintlify.app/analyzers/rules/AL0022) | ASP.NET Core | 错误 | `Al0020ToAl0024FormBindingAnalyzer` |
| [AL0023](https://ancplua.mintlify.app/analyzers/rules/AL0023) | ASP.NET Core | 错误 | `Al0020ToAl0024FormBindingAnalyzer` |
| [AL0024](https://ancplua.mintlify.app/analyzers/rules/AL0024) | ASP.NET Core | 错误 | `Al0020ToAl0024FormBindingAnalyzer` |
| [AL0025](https://ancplua.mintlify.app/analyzers/rules/AL0025) | 用法 | 警告 | `Al0025PreferStaticLambdaAnalyzer` |
| [AL0026](https://ancplua.mintlify.app/analyzers/rules/AL0026) | 用法 | 警告 | `Al0026AvoidDateTimeNowAnalyzer` |
| [AL0027](https://ancplua.mintlify.app/analyzers/rules/AL0027) | 用法 | 警告 | `Al0027AvoidNewtonsoftJsonAnalyzer` |
| [AL0028](https://ancplua.mintlify.app/analyzers/rules/AL0028) | Roslyn 工具 | 信息 | `Al0028UseIsEqualToAnalyzer` |
| [AL0029](https://ancplua.mintlify.app/analyzers/rules/AL0029) | Roslyn 工具 | 信息 | `Al0029UseHasAttributeAnalyzer` |
| [AL0030](https://ancplua.mintlify.app/analyzers/rules/AL0030) | Roslyn 工具 | 信息 | `Al0030UseTypeHierarchyAnalyzer` |
| [AL0031](https://ancplua.mintlify.app/analyzers/rules/AL0031) | Roslyn 工具 | 信息 | `Al0031UseOperationExtensionsAnalyzer` |
| [AL0032](https://ancplua.mintlify.app/analyzers/rules/AL0032) | Roslyn 工具 | 信息 | `Al0032UseOrEmptyAnalyzer` |
| [AL0033](https://ancplua.mintlify.app/analyzers/rules/AL0033) | Roslyn 工具 | 信息 | `Al0033UseToImmutableArrayOrEmptyAnalyzer` |
| [AL0034](https://ancplua.mintlify.app/analyzers/rules/AL0034) | Roslyn 工具 | 信息 | `Al0034UseWhereNotNullAnalyzer` |
| [AL0035](https://ancplua.mintlify.app/analyzers/rules/AL0035) | Roslyn 工具 | 信息 | `Al0035UseToDisplayStringExtensionsAnalyzer` |
| [AL0036](https://ancplua.mintlify.app/analyzers/rules/AL0036) | Roslyn 工具 | 警告 | `Al0036UseGuardNotNullAnalyzer` |
| [AL0037](https://ancplua.mintlify.app/analyzers/rules/AL0037) | Roslyn 工具 | 警告 | `Al0037UseTryParseExtensionsAnalyzer` |
| [AL0039](https://ancplua.mintlify.app/analyzers/rules/AL0039) | Roslyn 工具 | 警告 | `Al0039UseStringComparisonExtensionsAnalyzer` |
| [AL0040](https://ancplua.mintlify.app/analyzers/rules/AL0040) | Roslyn 工具 | 警告 | `Al0040UseAttributeExtensionsAnalyzer` |
| [AL0041](https://ancplua.mintlify.app/analyzers/rules/AL0041) | AOT 测试 | 错误 | `Al0041AotTestMustReturnIntAnalyzer` |
| [AL0042](https://ancplua.mintlify.app/analyzers/rules/AL0042) | AOT 测试 | 警告 | `Al0042AotTestExitCode100Analyzer` |
| [AL0043](https://ancplua.mintlify.app/analyzers/rules/AL0043) | AOT 测试 | 警告 | `Al0043TrimSafeViolationAnalyzer` |
| [AL0044](https://ancplua.mintlify.app/analyzers/rules/AL0044) | AOT 测试 | 警告 | `Al0044AotSafeViolationAnalyzer` |
| [AL0045](https://ancplua.mintlify.app/analyzers/rules/AL0045) | Roslyn 工具 | 警告 | `Al0045UseGuardNotNullOrEmptyAnalyzer` |
| [AL0046](https://ancplua.mintlify.app/analyzers/rules/AL0046) | Roslyn 工具 | 警告 | `Al0046UseGuardNotNullOrWhiteSpaceAnalyzer` |
| [AL0047](https://ancplua.mintlify.app/analyzers/rules/AL0047) | Roslyn 工具 | 警告 | `Al0047UseGuardNotZeroAnalyzer` |
| [AL0048](https://ancplua.mintlify.app/analyzers/rules/AL0048) | Roslyn 工具 | 警告 | `Al0048UseGuardNotNegativeAnalyzer` |
| [AL0049](https://ancplua.mintlify.app/analyzers/rules/AL0049) | Roslyn 工具 | 警告 | `Al0049UseGuardPositiveAnalyzer` |
| [AL0050](https://ancplua.mintlify.app/analyzers/rules/AL0050) | Roslyn 工具 | 警告 | `Al0050UseGuardNotEmptyGuidAnalyzer` |
| [AL0051](https://ancplua.mintlify.app/analyzers/rules/AL0051) | Roslyn 工具 | 警告 | `Al0051UseGuardDefinedEnumAnalyzer` |
| [AL0052](https://ancplua.mintlify.app/analyzers/rules/AL0052) | AOT 测试 | 错误 | `Al0052AotSafeCallsAotUnsafeAnalyzer` |
| [AL0053](https://ancplua.mintlify.app/analyzers/rules/AL0053) | AOT 测试 | 警告 | `Al0053UnnecessaryAotUnsafeAnalyzer` |
| [AL0054](https://ancplua.mintlify.app/analyzers/rules/AL0054) | 版本管理 | 警告 | `Al0054ToAl0056DiagnosticsAlignmentAnalyzer` |
| [AL0055](https://ancplua.mintlify.app/analyzers/rules/AL0055) | 版本管理 | 警告 | `Al0054ToAl0056DiagnosticsAlignmentAnalyzer` |
| [AL0056](https://ancplua.mintlify.app/analyzers/rules/AL0056) | 版本管理 | 警告 | `Al0054ToAl0056DiagnosticsAlignmentAnalyzer` |
| [AL0057](https://ancplua.mintlify.app/analyzers/rules/AL0057) | 线程 | 警告 | `Al0057ToAl0060ThreadingAnalyzer` |
| [AL0058](https://ancplua.mintlify.app/analyzers/rules/AL0058) | 线程 | 警告 | `Al0057ToAl0060ThreadingAnalyzer` |
| [AL0059](https://ancplua.mintlify.app/analyzers/rules/AL0059) | 线程 | 警告 | `Al0057ToAl0060ThreadingAnalyzer` |
| [AL0060](https://ancplua.mintlify.app/analyzers/rules/AL0060) | 线程 | 警告 | `Al0057ToAl0060ThreadingAnalyzer` |
| [AL0080](https://ancplua.mintlify.app/analyzers/rules/AL0080) | ASP.NET Core | 警告 | `Al0080MissingResilienceConfigurationAnalyzer` |
| [AL0081](https://ancplua.mintlify.app/analyzers/rules/AL0081) | ASP.NET Core | 警告 | `Al0081MissingHealthChecksAnalyzer` |
| [AL0082](https://ancplua.mintlify.app/analyzers/rules/AL0082) | 配置 | 信息 | `Al0082ConsiderConnectionStringAnalyzer` |
| [AL0084](https://ancplua.mintlify.app/analyzers/rules/AL0084) | ASP.NET Core | 警告 | `Al0084MissingServiceDiscoveryAnalyzer` |
| [AL0094](https://ancplua.mintlify.app/analyzers/rules/AL0094) | AOT 测试 | 警告 | `Al0094AvoidDynamicKeywordAnalyzer` |
| [AL0095](https://ancplua.mintlify.app/analyzers/rules/AL0095) | AOT 测试 | 警告 | `Al0095AvoidExpressionCompileAnalyzer` |
| [AL0101](https://ancplua.mintlify.app/analyzers/rules/AL0101) | AOT 测试 | 警告 | `Al0101AvoidActivatorCreateInstanceAnalyzer` |
| [AL0102](https://ancplua.mintlify.app/analyzers/rules/AL0102) | AOT 测试 | 警告 | `Al0102AvoidTypeGetTypeAnalyzer` |
| [AL0103](https://ancplua.mintlify.app/analyzers/rules/AL0103) | 设计 | 警告 | `Al0103ClosedTypeHierarchySwitchAnalyzer` |
| [AL0104](https://ancplua.mintlify.app/analyzers/rules/AL0104) | 可靠性 | 警告 | `Al0104PreferAwaitUsingAnalyzer` |
| [AL0105](https://ancplua.mintlify.app/analyzers/rules/AL0105) | 线程 | 警告 | `Al0105AvoidBlockingCallsInAsyncAnalyzer` |
| [AL0106](https://ancplua.mintlify.app/analyzers/rules/AL0106) | ASP.NET Core | 警告 | `Al0106AvoidTaskRunInAspNetCoreAnalyzer` |
| [AL0111](https://ancplua.mintlify.app/analyzers/rules/AL0111) | 可靠性 | 警告 | `Al0111SqlInterpolationInCommandTextAnalyzer` |
| [AL0112](https://ancplua.mintlify.app/analyzers/rules/AL0112) | 可靠性 | 警告 | `Al0112FireAndForgetTaskAnalyzer` |
| [AL0114](https://ancplua.mintlify.app/analyzers/rules/AL0114) | 可靠性 | 警告 | `Al0114PreferTryParseAnalyzer` |
| [AL0115](https://ancplua.mintlify.app/analyzers/rules/AL0115) | 可靠性 | 警告 | `Al0115EmptyCatchBlockAnalyzer` |
| [AL0116](https://ancplua.mintlify.app/analyzers/rules/AL0116) | 可靠性 | 警告 | `Al0116ExceptionLeakedInResponseAnalyzer` |
| [AL0117](https://ancplua.mintlify.app/analyzers/rules/AL0117) | 用法 | 信息 | `Al0117UnnecessaryLinqMaterializationAnalyzer` |
| [AL0118](https://ancplua.mintlify.app/analyzers/rules/AL0118) | 可靠性 | 警告 | `Al0118ReadModifyWriteWithoutTransactionAnalyzer` |
| [AL0119](https://ancplua.mintlify.app/analyzers/rules/AL0119) | Roslyn 工具 | 警告 | `Al0119SymbolStoredInModelAnalyzer` |
| [AL0120](https://ancplua.mintlify.app/analyzers/rules/AL0120) | Roslyn 工具 | 警告 | `Al0120UseIncrementalGeneratorAnalyzer` |
| [AL0121](https://ancplua.mintlify.app/analyzers/rules/AL0121) | Roslyn 工具 | 警告 | `Al0121NormalizeWhitespaceAnalyzer` |
| [AL0122](https://ancplua.mintlify.app/analyzers/rules/AL0122) | 设计 | 错误 | `Al0122DuckDbTableMustBePartialAnalyzer` |
| [AL0123](https://ancplua.mintlify.app/analyzers/rules/AL0123) | 设计 | 警告 | `Al0123DuckDbColumnConflictingOrdinalAnalyzer` |
| [AL0125](https://ancplua.mintlify.app/analyzers/rules/AL0125) | Roslyn 工具 | 信息 | `Al0125UseStringComparisonAnyExtensionsAnalyzer` |
| [AL0126](https://ancplua.mintlify.app/analyzers/rules/AL0126) | 可靠性 | 信息 | `Al0126CancellationTokenPropagationAnalyzer` |
| [AL0127](https://ancplua.mintlify.app/analyzers/rules/AL0127) | 版本管理 | 警告 | `Al0127OutdatedMafPackageVersionAnalyzer` |
| [AL0128](https://ancplua.mintlify.app/analyzers/rules/AL0128) | GenAI | 警告 | `Al0128DestructiveToolMustRequireApprovalAnalyzer` |
| [AL0129](https://ancplua.mintlify.app/analyzers/rules/AL0129) | GenAI | 信息 | `Al0129ToolMustDeclareSideEffectAnalyzer` |
| [AL0130](https://ancplua.mintlify.app/analyzers/rules/AL0130) | GenAI | 信息 | `Al0130ToolMustDeclareCapabilityAnalyzer` |
| [AL0137](https://ancplua.mintlify.app/analyzers/rules/AL0137) | Roslyn 工具 | 警告 | `Al0137UseGuardForThrowIfAnalyzer` |
| [AL0138](https://ancplua.mintlify.app/analyzers/rules/AL0138) | 可靠性 | 警告 | `Al0138UseExplicitMidpointRoundingAnalyzer` |
| [AL0139](https://ancplua.mintlify.app/analyzers/rules/AL0139) | 样式 | 警告 | `Al0139ToAl0140UseImplicitOrExplicitTypeAnalyzer` |
| [AL0140](https://ancplua.mintlify.app/analyzers/rules/AL0140) | 样式 | 警告 | `Al0139ToAl0140UseImplicitOrExplicitTypeAnalyzer` |
**图例:** `错误` = 生成错误,`警告` = 生成警告,`信息` = IDE 建议,`已禁用` = 默认关闭。
## 重要规则
**`AL0126` — `CancellationToken` 传播(可靠性,信息)。** 将可用的取消令牌转发到异步调用中。该规则及其代码修复覆盖两种模式:
- 调用**省略**了 `CancellationToken` 重载参数,但作用域中有一个合适的令牌可用。
- 调用显式传递了一个**默认/无操作**令牌 — `default`、`default(CancellationToken)` 或 `CancellationToken.None` — 并且应该使用可用的真实令牌。
两条路径使用相同的令牌选择逻辑:首先选择最近的有用令牌表达式。在 xUnit v3 测试中,当没有更近的令牌可用时,修复可以使用 `global::Xunit.TestContext.Current.CancellationToken`。
## 代码修复
目前以下规则可提供自动修复:
AL0002, AL0004, AL0005, AL0008, AL0011, AL0014, AL0015, AL0016, AL0025, AL0026, AL0027, AL0028, AL0029, AL0030, AL0031, AL0032, AL0033, AL0034, AL0035, AL0036, AL0037, AL0039, AL0040, AL0045, AL0046, AL0047, AL0048, AL0049, AL0050, AL0051, AL0103, AL0121, AL0122, AL0126, AL0137, AL0138, AL0139, AL0140
## 配置
```
[*.cs]
dotnet_diagnostic.AL0001.severity = error
dotnet_diagnostic.AL0014.severity = none
```
## 开发命令
```
# I think for such cases, it's best to translate the descriptive part and keep the proper noun. So, "ANcpLua.Analyzers" -> "ANcpLua 分析器". But let's see the other headings.
dotnet build ANcpLua.Analyzers.slnx -c Release
# 2. "Build" – This is a common term in software development. Translate to Chinese: "构建" or "编译". In the context of software, "Build" often means to compile or construct, so "构建" is standard.
dotnet test --project tests/ANcpLua.Analyzers.Tests/ANcpLua.Analyzers.Tests.csproj
# 3. "Test" – Similarly, "Test" translates to "测试".
dotnet pack src/ANcpLua.Analyzers/ANcpLua.Analyzers.csproj -c Release -o artifacts -p:PackageId=ANcpLua.Analyzers
```
## 文档
- 概述: [ancplua.mintlify.app/analyzers/overview](https://ancplua.mintlify.app/analyzers/overview)
- 规则文档: [ancplua.mintlify.app/analyzers/rules](https://ancplua.mintlify.app/analyzers/rules)
### 生成的分析器场景文档
每个分析器的场景目录,自动生成于测试场景中,
位于 `src/ANcpLua.Analyzers.AnalyzerDocs/` — 每个文件展示了更改前后的示例
以及分析器的真实诊断信息(通过 CI 使用 `scripts/generate-docs.ps1 -ValidateNoChanges` 进行回归保护):
- [AL0028 — 使用 IsEqualTo 扩展](docs/Al0028UseIsEqualTo.md)
在修改场景或诊断信息后重新生成:
```
pwsh ./scripts/generate-docs.ps1
```
## 相关项目
- [ANcpLua.NET.Sdk](https://github.com/ANcpLua/ANcpLua.NET.Sdk) - MSBuild SDK(自动注入此分析器包)
- [ANcpLua.Roslyn.Utilities](https://github.com/ANcpLua/ANcpLua.Roslyn.Utilities) - 共享的 Roslyn 辅助工具和扩展
- [ANcpLua.Agents](https://github.com/ANcpLua/ANcpLua.Agents) - MAF 运行时辅助工具 + 代理测试基础设施
## 许可证
[MIT](LICENSE)
标签:AOT 安全检测, ASP.NET Core 最佳实践, CI/CD 代码质量, C# 静态分析, GenAI 工具治理, macOS, .NET Standard 2.0, .NET 开发工具, NuGet 包, Roslyn 分析器, 代码分析工具, 代码规范 enforcement, 代码诊断, 使用模式分析, 可靠性检查, 最佳实践实施, 版本管理集成, 线程安全分析, 自动代码修复, 设计模式验证, 软件开发辅助