【问题标题】:How to disable compiler warnings in only generated code without editing file(s)如何在不编辑文件的情况下仅在生成的代码中禁用编译器警告
【发布时间】:2021-02-25 18:37:11
【问题描述】:

我有一些生成的代码有一堆编译器警告。我想在生成的文件中禁用它们,但将这些警告保留在项目的其余部分中,以便可以修复它们。我正在使用 Visual Studio 2019 社区版,生成的文件来自 Entity Framework 和其他 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 社区版自动抑制菜单项 Analyze -> Build And Suppress Active Issues -> For Project 的警告,但这只是在文件中添加了一堆 #pragma 指令,如果文件已重新生成,我想避免。

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

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

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

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

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

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

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

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

很遗憾,此选项已被选中,并且不会抑制 CS1591 警告。

所以我的实际问题是:

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

【问题讨论】:

  • 但是......你有一个有效的答案,但你显然不喜欢它......这是在脚本中添加#pragma。无论如何它都是生成的代码,所以我不明白你为什么认为这是一个黑客。也许你应该开始喜欢这种方法?我的意思是,你的老板正在处理你的案子。 会问你是否用“hack”修复它吗?
  • [SuppressMessage] 仅适用于代码分析警告,CS1591 不适用,它是编译器警告。这确实需要更智能的代码生成,无论是#pragma 还是对错误文档注释的修复。由于这是显而易见的,但没有考虑到,全球压制是可能的结果。通过在自己的程序集中隔离自动生成的代码来限制其影响。
  • 1) 我认为您可能能够在整个职业生涯中都没有在仅 Windows VS 项目(尤其是 .NET 项目)中看到 Makefile,某些行业肯定不会将它们用于 .NET。 2)“文本墙”问题的一个可能解决方案是将研究与学术风格的短链接列表(如[0](link][1](link)[2](link))链接起来,但很难说。 3) 我认为“我找到了解决我的问题的方法,但我不喜欢它”这种形式的问题没有任何问题,这就是研究工作的真实样子。
  • 不幸的是,您遇到了一个晦涩难懂的问题,这是 Roomba 的天然猎物。晦涩是因为无论出于何种原因它显然具有低 SEO 汁液,因为它解决的问题是平凡的(抑制设计不良的第三方代码中的滋扰警告),所以不酷。真正的答案可能是“错误代码生成器的作者来修复他们的东西”,读者可能会认为当代码生成器更新时这个问题会消失。破解别人的错误并不“酷”,不如热门的新语言功能酷。
  • 话虽如此,我并不是说 1) 对生成器作者进行错误修复是可行的,2) 你不应该尝试破解它,否则破解是不值得的讨论,3)你不应该关心警告并尝试摆脱它们,4)不酷或晦涩的问题是不好的,或者 5)这里发生的事情是一件好事,我只是告诉你它是怎么回事,所以是基于投票的,喜欢与否受欢迎程度是问题成功的一个因素。有时在这里获得某些问题的答案只是浪费时间,研究工作本身无法解决问题。

标签: c# visual-studio-2019 suppress-warnings generated-code


【解决方案1】:

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

【讨论】:

  • 我已将其添加到我的 csproj 文件中,但出现错误。如果这很重要,我正在使用 .Net Core 3.1。错误 MSB4186 无效的静态方法调用语法:“[System.IO.File]::ReadAllText().StartsWith("#pragma warning")”。找不到方法“System.IO.File.ReadAllText”。静态方法调用应采用以下形式:$([FullTypeName]::Method()),例如$([System.IO.Path]::Combine(a, b))。检查所有参数是否已定义、类型正确且指定顺序正确。
  • 我认为您有此错误,因为它找不到任何 AutoGeneratedFiles 文件。在示例中,我将 *.Designer.cs 用于匹配 resx 生成的文件,但您应该更改它以匹配项目生成的文件
  • 好的。它似乎不会在另一个确实有“.designer.cs”文件的项目中抛出任何错误,但不幸的是那些不是抛出警告的文件。它们位于实体的“.cs”文件中。我会玩这个,看看我能不能让它工作。例如:20210122181917_Initial.cs 我想我必须寻找那些下划线,因为除了实体生成的文件之外,我认为任何其他文件都没有它们。
  • 我已经通过添加第二个AutoGeneratedFiles 来包含“*/_*.cs”和Concat 第一个参数是“&”来工作。 #pragma warning disable 1591 // <自动生成/> "”。这给了我auto-generated 标记,它可以防止其他警告,还可以防止usingnamespacepragma 语句的末尾被忽略。如果您更新或让我更新您的答案,您将获得赏金,除非有人(以某种方式)提出更好的答案。我仍然认为这有点hacky,但总比没有好。感谢您的帮助!
  • 我认为它很老套,因为我必须将它添加到我需要它的每个 .csproj 文件中,而且我不喜欢手动编辑这些文件。但仅仅因为我不喜欢它,并不意味着它不能完成或它不起作用。
【解决方案2】:

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

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

如果存在识别生成代码的文件名模式,compiler warnings can be suppressed 在生成的代码中使用EditorConfig。例如,这就是我在生成的代码中disabled the warnings for using obsolete code elements 的方式——我仍然需要使用#pragma 来抑制手动编写的代码中的警告。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多