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

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

我有一些生成的代码有很多编译器警告。我想在生成的文件中禁用它们,但将这些警告保留在项目的其余部分中,以便可以修复它们。我使用的是 Visual Studio 2019 Community Edition,生成的文件来自实体框架和其他 NuGet 包。

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

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

相关文件是连接服务的

Reference.cs
。它的命名空间为
Proxy.ProvisioningService
,这个文件包含几十个类。我还有几个实体框架迁移文件,它们在完全不同的解决方案中存在相同的问题。

我有一个 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
指令,但该脚本对我来说似乎是一个黑客。我宁愿根本不编辑生成的代码。

我也不想把它放在

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

另一个 SE/SO 答案建议使用

GeneratedCodeAttribute
属性来防止生成的文件发出警告。不幸的是,我的文件已经有这个并且它仍然抛出警告。

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

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

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

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

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

不幸的是,该选项已被选中,并且不会抑制 CS1591 警告。

所以我的实际问题是:

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

c# visual-studio-2019 suppress-warnings generated-code
4个回答
9
投票

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


7
投票

SuppressMessage 属性 仅适用于代码分析警告。其摘要如下:

禁止报告特定的代码分析规则违规行为,从而允许对单个代码工件进行多次抑制。不适用于编译器诊断。

如果存在标识生成代码的文件名模式,则可以使用 EditorConfig 在生成的代码中抑制编译器警告。例如,这就是我如何在生成的代码中禁用使用过时代码元素的警告——我仍然需要使用#pragma 来抑制手动编写的代码中的警告。

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

1
投票
对于 WCF 连接的服务,最简单的解决方案可能是一开始就不显示警告。

由于 CS1591 警告是关于公共类型的,因此您可以使用

dotnet-svcutil 工具生成 Reference.cs

 文件并传递 
--internal
 选项,以便生成的类型为 
internal
 而不是 
public
,因此完全摆脱 CS1591。

对于生成代码的其他工具,请寻找类似的选项来生成内部类型而不是公共类型。例如,您可以将

--assemblyVisible

 选项与 
xscgen 工具一起使用。


0
投票
谢谢@j-loscos,很有魅力。我稍微调整了您的解决方案以包含一些新行(并在最后删除了不必要的恢复)。

<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.Environment]::NewLine),$([System.Environment]::NewLine),$([System.IO.File]::ReadAllText(%(AutoGeneratedFiles.FullPath)))))" Overwrite="true" Encoding="Unicode" /> </Target>
    
© www.soinside.com 2019 - 2024. All rights reserved.