从异常类派生警告:CA2237:使用SerializableAttribute标记ISerializable类型

时间:2012-07-04 10:38:06

标签: exception code-analysis compiler-warnings .net

我从各种异常中派生了几个类。现在VS在这个问题的标题中发出警告。

  1. 有人可以解释抑制此规则的含义吗?

  2. 您能否解释here中的规则“请勿针对异常类禁止此规则的警告,因为它们必须可序列化才能跨应用程序域正常运行。”

  3. P.S。好吧,我自己也得到了答案。您确实必须将异常标记为可序列化。它们在同一AppDomain中没有此属性的情况下工作正常。但是,如果您尝试从其他域捕获它,则必须进行序列化才能跨越应用程序边界。这就是我找到的主要原因。

2 个答案:

答案 0 :(得分:15)

这不是Visual Studio警告,它是由FxCop工具生成的警告。您可以从VS Analyze菜单运行。 FxCop是一个静态分析器,它在.NET程序中查找编译器不会标记的常见陷阱。它的大多数警告都非常模糊,而且很少是非常严重的问题,你需要将它视为“你有没有想过这个?”一种工具。

它试图在这里提醒你的小事实是,Exception类实现了ISerializable并具有[Serializable]属性。这是一个非常困难的要求,它使基本的Exception对象可以跨应用程序域进行序列化。必要因为Exception不是从MarshalByRefObject派生的。并且必须允许您在另一个应用程序域中运行的代码抛出您可以捕获的异常。

所以FxCop注意到你没有为自己的Exception派生类做同样的事情。如果你打算让代码在另一个app-domain中运行你的异常,那么这真的只是一个问题。 FxCop不够聪明,不知道你是否这样做它只能提醒你它出错了。这是非常罕见的,所以当你不知道你是否愿意或者听起来对你来说这听起来像中文时,请随意忽略警告。

答案 1 :(得分:1)

如果您不打算在您的应用程序中使用多个AppDomain,我认为您可以忽略它或抑制它。