如何在自己的代码中使用禁止的API分析器

问题描述 投票:0回答:1

Roslyn 已禁止分析器功能。我想在我自己的代码中使用通过 CSharpCompilation 类和 WithAnalyzers 扩展方法动态编译代码。我尝试在 https://www.nuget.org/packages/Microsoft.CodeAnalysis.BannedApiAnalyzers 添加包引用,但该包无法用作常规 nuget 包。 CSharpSymbolIsBannedAnalyzer 类标记为未知。

我的代码是这样的:

var compilation = CSharpCompilation.Create(/* made syntax tree + dll refs */);

var analyzers = ImmutableArray.Create<DiagnosticAnalyzer>(
    new CSharpSymbolIsBannedAnalyzer()); // <- unknown type

var compilationWithAnalyzers = compilation.WithAnalyzers(
    analyzers,
    new AnalyzerOptions(ImmutableArray.Create<AdditionalText>(new BannedSymbolsAdditionalText(@"T:System.Diagnostics.Process;Don't use Process"))),
    cancellationToken);

但是当我尝试编译时 - CSharpSymbolIsBannedAnalyzer 是未知类型。

c# roslyn
1个回答
0
投票

要在自己的项目中使用 Banned API 分析器,您不需要在代码中使用分析器,只需添加 NuGet 包引用即可:

  1. 将对 NuGet 包的引用添加到您的项目中:
<ItemGroup>
  <PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4" PrivateAssets="All" />
</ItemGroup>
  1. BannedSymbols.txt
    文件添加到项目的编译中:
<ItemGroup>
  <AdditionalFiles Include="$(MSBuildThisFileDirectory)BannedSymbols.txt" />
</ItemGroup>
  1. 使用您想要禁止的 API 及其原因填充您的
    BannedSymbols.txt
    文件,例如:
P:System.DateTime.Now; Use System.DateTime.UtcNow instead.
M:System.DateTimeOffset.op_Implicit(System.DateTime); Do not implicitly cast DateTime to DateTimeOffset.
© www.soinside.com 2019 - 2024. All rights reserved.