【问题标题】:suppress warning for generated c# code抑制生成的 C# 代码的警告
【发布时间】:2011-02-11 16:51:48
【问题描述】:

我已为我的 VS 项目打开“将警告视为错误”,这意味着我会因缺少文档而出错(此特定项目的好提醒)。

但是,部分代码是由不插入 xml 文档的自定义工具生成的,因此我正在寻找忽略仅针对生成的代码而不是整个项目的缺失 xml 文档的方法。我对生成的实际文件没有影响,也不能真正在文件中插入任何东西(因为它经常被工具重新生成)所以我在生成的文件之外寻找存在的东西(生成的类是部分的,如果有帮助的话)

【问题讨论】:

  • @TomTom:嗯,我不认为这是一个有效的解决方案(并且称他为愚蠢有点过分了,作者让我们俩都在这里击败了 100k 点... .)

标签: c# visual-studio code-generation suppress-warnings


【解决方案1】:

避免在生成的代码上出现警告或代码分析错误的最佳方法是使用 GeneratedCodeAttribute 修饰生成的类,并使代码文件以 *.generated.cs 模式结尾。

如果你的代码文件也有文件头,你应该有这些标签:

//----------------------
// <auto-generated>
//     Tool description
// </auto-generated>
//----------------------

这不是强制性的,但如果您有代码文件头,这是一个很好的做法。

这样,FxCop 和 StyleCop 等其他工具将不再分析您的代码。

异常的是你的代码生成工具没有用上面提到的属性来修饰你的代码元素。尝试查看您的工具设置中是否有启用选项或联系开发团队。


编辑: 生成的类是否是部分类,实际类的名称和编号是否经常更改?因为如果生成的代码内容没有太大变化,你可以做的只是创建另一个代码文件,然后声明生成的部分类,用 GeneratedCodeAttribute 装饰它们。有一次它挽救了我的生命(和我的时间!)。

【讨论】:

  • “我对生成的实际文件没有影响” - 这不排除这个答案吗?
  • 我明白问题出在哪里,我在使用来自 Codeplex 的 DSL 时遇到了完全相同的问题。事实是,如果它经常重新生成,您不想每次都手动修改它。我所做的是联系了解决问题的 Codeplex 开发人员。实际上有两种解决方案:在工具中寻找要启用的设置或联系开发团队。
  • @TomTom(和@TheRHCP):正如 Jon 指出的那样,我无法控制生成的代码,所以不要继续添加属性。此外,部分类可能会解决类中缺少的 cmets,但对我的属性/方法没有帮助...
  • 我对 WCF RIA 生成的代码有类似的问题。所有 *.g.i.cs 生成的文件在它们的文件头中都有 ,但是 VS 2010 代码分析工具仍然在它们上面绊倒。有什么建议吗?
【解决方案2】:

编辑:见 cmets 表明此 与 C# 4 一起工作。我不清楚它是否在早期版本的编译器中工作。不过,C# 4 规范说明了这一点。第 2.5.8.1 节指出:

#pragma warning restore 指令将所有或给定的一组警告恢复到在编译单元开始时有效的状态。请注意,如果在外部禁用了特定警告,#pragma warning restore(无论是针对所有警告还是指定警告)都不会重新启用该警告。

Jeff 有一个workaround in a blog post - 基本上是为了在构建过程中重新处理自动生成的代码。


正如 Tom 所说,您可以在整个项目中添加“忽略”(构建/抑制警告 - 输入 1591 作为警告编号) - 但是您可以在顶部自己恢复警告您的每个非生成文件:

#pragma warning restore 1591

它很丑,但它有效(我刚刚测试过)。

【讨论】:

  • @TomTom:以什么方式?您可以相当容易地自动检查您是否在每个非生成文件的开头获得了该编译指示。 (OP 很可能已经有一些东西要检查版权声明等 - 可以很容易地修改以包含该 pragma。)最终结果是 OP 想要的:没有 XML cmets 的手写文件的错误,并且生成的文件没有此类错误。
  • 接受这个作为答案,因为所有其他人都无法解决不接触生成文件的问题......很好,乔恩
  • @Jon:这不适用于 C# 4。根据规范,如果警告被全局禁用(即由项目),restore 将恢复到该全局状态(即禁用)。我应该补充一下,我试过了(我不只是阅读规范)。
  • @Jeff:哎呀。诡异的。我想知道它之前是否真的有效......编辑了我的答案:(
  • @Jon:有关 MSBuild 4 的可行解决方案,请参阅此博客条目。这适用于我的 Windows 工作流自动生成的文件(尽管我只禁用了 1591 而不是全部)。 lvquoc.blogspot.com/2010/11/…
【解决方案3】:

您能做的最好的事情就是在包含生成代码的项目中抑制特定警告。您可以在“构建”选项卡上的“项目属性”中执行此操作。这并不理想,但没有将编译指示放入生成的代码中,这是您能做的最好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2010-12-08
    • 2017-04-11
    • 2019-11-30
    • 2016-07-19
    • 1970-01-01
    相关资源
    最近更新 更多