【问题标题】:Create an Attribute to Break the Build创建一个属性来破坏构建
【发布时间】:2008-08-26 14:15:08
【问题描述】:

好的,从my previous question开始。

我真正想做的是创建某种属性,它允许我装饰一个破坏构建的方法。很像 Obsolete("reason", true) 属性,但不会错误地识别过时的代码。

澄清:我不希望它在ANY F6(构建)按下时破坏构建,我只希望它在使用装饰的方法时破坏构建属性在代码的其他地方被调用。就像我说的,类似过时,但不一样。

我知道我并不孤单,因为other users want to use it for other reasons。我以前从未创建过自定义属性,所以这对我来说是全新的!

【问题讨论】:

标签: .net attributes


【解决方案1】:

我认为这对微软来说是一个很好的功能要求:创建一个抽象基类属性CompilerExecutedAttribute,编译器以某种方式处理或影响编译过程。然后我们可以继承这个属性并实现不同的操作,例如发出错误或警告。

【讨论】:

    【解决方案2】:

    如果这是用于 XML 序列化和 NHibernate,您希望无参数构造函数可访问(如您引用的 example 中的情况),则使用私有或受保护的无参数构造函数进行序列化,或受保护的构造函数对于 NHibernate。使用受保护的版本,您可以向能够调用该代码的继承类敞开大门。

    如果您不希望代码调用方法,请不要使其可访问。

    编辑:为了回答更深层次的问题,AFAIK 编译器只知道三个属性:Obsolete, Conditional, and AttributeUsage。为其他属性添加特殊处理需要修改编译器。

    【讨论】:

    • 在谷歌上进行了一些挖掘,看起来你是对的,Obsolete 的构建破坏能力实际上是编译器魔法而不是编码属性魔法!该死!
    【解决方案3】:

    如果您认为警告(这是 [Obsolete] 抛出的)破坏构建,则只需使用 #warning 编译器指令。

    编辑:我从未使用过,但#error 也可用。

    【讨论】:

    • 如何使用它来仅在调用该方法时才显示警告?据我所知,#warning 会导致在代码编译时发出警告。
    【解决方案4】:

    我认为唯一的万无一失的方法是扩展 Visual Studio(通过 VSIP)并订阅正确的事件(可能在 EnvDTE.BuildEvents 中)类,并检查您的代码是否使用了构造函数,然后取消如果检测到就构建。

    【讨论】:

      【解决方案5】:

      这听起来有点像Yesterday's TDWTF。 :-)

      【讨论】:

        【解决方案6】:

        我必须同意 Greg 的观点:为它创造一个属性。

        如果你真的很认真,也许可以找到一种方法来确定构造函数是否被 XMLSerializer 以外的任何东西访问,如果是则抛出异常。

        【讨论】:

          【解决方案7】:

          我建议你使用 #error 指令。

          另一个可能起作用的未知属性是conditional attribute(取决于您要实现的目标)

          [Conditional("CONDITION")] 
          public static void MiMethod(int a, string msg)
          

          如果定义了“MY_CONDITION”,它将从 IL 代码本身中删除方法调用。

          【讨论】:

            【解决方案8】:

            创建一个 FxCop 规则,并将 FxCop 添加到您的集成构建中以检查这一点。

            您会收到警告,而不是构建失败。属性在反射时间而不是构建时间“运行”。

            或者(这是相当讨厌的)在您不想被调用的方法周围放置一个编译器指令。然后,如果您调用它,您的代码将会中断,但您可以设置一个传递正确编译器指令但不传递的构建。

            【讨论】:

              【解决方案9】:

              在构建后步骤中引发自定义异常并对其进行单元测试

              【讨论】:

                【解决方案10】:

                4 年后回复:)

                如果有过时的替代品,我也有同样的问题。

                据我回忆(channel9 视频)不久前,微软表示它正在努力让开发人员在某个时候能够访问编译器 api 之类的东西,因此可以想象,将来您可以编写一个编译器“插件”将允许使用您自己的自定义属性来装饰方法,并告诉编译器如果看起来装饰的代码可能在代码中的其他地方被调用等等,则取消。

                细想一下,这实际上会很酷。它还提醒我,我还应该尝试阅读 MS 正在处理的那个编译器 api 的进展......

                【讨论】:

                  【解决方案11】:

                  为什么不编造一些东西呢?未知属性肯定会破坏构建。

                  [MyMadeUpAttributeThatBreaksTheBuildForSure]
                  public class NotDoneYet {}
                  

                  【讨论】:

                    猜你喜欢
                    • 2012-09-15
                    • 2018-03-05
                    • 1970-01-01
                    • 2012-06-19
                    • 2015-07-12
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多