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

问题描述

我有一些生成代码,其中包含一堆编译器警告。我想在生成文件中禁用它们,但在项目的其余部分保留这些警告,以便可以修复它们。我使用的是 Visual Studio 2019 社区版,生成文件来自实体框架和其他 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 社区版通过菜单Analyze -> Build And Suppress Active Issues -> For Project 自动取消警告,但这只是在文件添加了一堆 #pragma 指令,这些指令必须是如果文件重新生成,则替换,我想避免这种情况。

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

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

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

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

抑制项目中生成代码的警告

  1. 解决方案资源管理器中右键单击项目,然后单击属性

  2. 选择代码分析选项卡。

  3. 选中从生成代码中抑制结果复选框。

遗憾的是,此选项已被选中且未取消 CS1591 警告。

所以我的实际问题是:

如何从生成代码文件中抑制警告,特别是 CS1591,而不编辑它们,并且不抑制整个项目中的警告?

解决方法

您说您考虑使用脚本来更新文件以添加#pragma 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>