如何在不编辑文件的情况下仅在生成的代码中禁用编译器警告

How to disable compiler warnings in only generated code without editing file(s)

我有一些生成的代码有一堆编译器警告。我想在生成的文件中禁用它们,但将这些警告保留在项目的其余部分以便修复它们。我正在使用 Visual Studio 2019 社区版,生成的文件来自 Entity Framework 和其他 NuGet 包。

我想在不更改文件的情况下执行此操作,因此如果它们重新生成,我将不会收到警告。我也不想在整个项目范围内禁用警告,因为它们通常是有用的警告。我也不想编辑 NuGet 包,因为那样要么不需要升级它们,因为有新版本可用,要么可能必须对新版本进行更改。

我已经阅读了大量内容,但显然发布链接“太多了”,所以我删除了它们。如果您想查看它们,请查看编辑历史记录。

有问题的文件是 Reference.cs 连接服务。它有 Proxy.ProvisioningService 的命名空间,这个文件包含几十个 类。我还有几个 Entity Framework 迁移文件,它们在完全不同的解决方案中存在相同的问题。

我有一个 GlobalSuppressions.cs 文件,我想将 CS1591(特别是)添加到其中,但我当前的条目不起作用。其他条目适用于其他警告,我已经尝试使用以下代码的变体,包括尝试匹配其他条目的格式,但到目前为止没有任何效果。我已经将“构建”从“编译”更改为“构建”,删除了 MessageId,将 Scope 更改为“模块”、“程序集”和“名称空间和后代”,并且尝试了几种不同的方法设置 Target.

的方法
[assembly: SuppressMessage("Build", "CS1591:Missing XML comment for publicly visible type or member", Justification = "Generated code", MessageId = "CS1591", Scope = "namespaceanddescendants", Target = "Proxy.ProvisioningService")]

在其中一个站外链接中,它建议我右键单击错误,转到 Suppress -> In Suppression File,但这不是列出的选项。这是我无法在 GlobalSuppressions.cs 文件中执行此操作的线索吗?

我试图让 Visual Studio 2019 Community Edition 自动抑制菜单项 Analyze -> Build And Suppress Active Issues -> For Project 的警告,但这只是向文件添加了一堆 #pragma 指令,如果重新生成文件,则必须替换它,我想避免这种情况。

其中一个链接答案建议编写一个脚本以在编译时添加 #pragma 指令,但该脚本对我来说似乎是一个 hack。我宁愿根本不编辑生成的代码。

我也不想把它放在 Project -> Properties -> Build -> Suppress Warnings 部分,因为我希望手写代码仍然抛出这些警告。

另一个 SE/SO 答案建议使用 GeneratedCodeAttribute 属性来防止生成的文件发出警告。不幸的是,我的文件已经有了这个,但它仍然发出警告。

另一个建议是关闭这些生成文件的警告:

To suppress warnings for generated code in a project

  1. Right-click the project in Solution Explorer and then click Properties.

  2. Choose the Code Analysis tab.

  3. Select the Suppress results from generated code check box.

不幸的是,这个选项已经被选中并且没有抑制 CS1591 警告。

所以我的实际问题是:

如何在不编辑生成的代码文件并且不在整个项目中抑制警告的情况下抑制生成的代码文件中的警告,特别是 CS1591?

您说您考虑使用脚本更新文件以添加#pragma a hack,但我想不出其他解决方案。

我认为您可以通过在 .csproj 文件中添加类似以下内容的 MSBuild 任务轻松完成此操作:

<Target Name="DisableWarnings" BeforeTargets="CoreCompile">
    <ItemGroup>
        <AutoGeneratedFiles Include="**/*.Designer.cs" />
    </ItemGroup>
    <WriteLinesToFile File="%(AutoGeneratedFiles.FullPath)"
        Condition="!$([System.IO.File]::ReadAllText(%(AutoGeneratedFiles.FullPath)).StartsWith(&quot;#pragma warning&quot;))"
        Lines="$([System.String]::Concat(&quot;#pragma warning disable 1591&quot;,$([System.IO.File]::ReadAllText(%(AutoGeneratedFiles.FullPath))),&quot;#pragma warning restore 1591&quot;))"
        Overwrite="true"
        Encoding="Unicode" />
</Target>

SuppressMessage attribute 仅适用于代码分析警告。它的摘要是:

Suppresses reporting of a specific code analysis rule violation, allowing multiple suppressions on a single code artifact. Does not apply to compiler diagnostics.

如果有文件名模式识别生成的代码,compiler warnings can be suppressed in the generated code using EditorConfig. For example, this is how I disabled the warnings for using obsolete code elements 在我生成的代码中——我仍然需要使用 #pragma 抑制手动编写的代码中的警告。

[*.generated.cs]
dotnet_diagnostic.CS0612.severity = none
dotnet_diagnostic.CS0618.severity = none