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

Exception 从异常类派生警告:CA2237:使用SerializableAttribute标记ISerializable类型,exception,code-analysis,compiler-warnings,.net,Exception,Code Analysis,Compiler Warnings,.net,我从各种异常中派生了几个类。现在VS给出了警告,正如这个问题的标题所示 有人能解释一下压制这一规则意味着什么吗 您能否解释一下规则中的“不要禁止此规则对异常类发出警告,因为它们必须可序列化才能跨应用程序域正常工作。” 我自己也有答案。您确实必须将异常标记为可序列化。在同一AppDomain中,如果没有此属性,它们可以正常工作。但是,如果您试图从其他域捕获它,则必须对其进行序列化才能跨越应用程序边界。这就是我发现的主要原因。如果您不打算在应用程序中使用多个AppDomain,我认为您可以忽略或抑制

我从各种异常中派生了几个类。现在VS给出了警告,正如这个问题的标题所示

  • 有人能解释一下压制这一规则意味着什么吗

  • 您能否解释一下规则中的“不要禁止此规则对异常类发出警告,因为它们必须可序列化才能跨应用程序域正常工作。”


  • 我自己也有答案。您确实必须将异常标记为可序列化。在同一AppDomain中,如果没有此属性,它们可以正常工作。但是,如果您试图从其他域捕获它,则必须对其进行序列化才能跨越应用程序边界。这就是我发现的主要原因。

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

    这不完全是Visual Studio警告,而是FxCop工具生成的警告。可以从VS Analyze菜单中运行。FxCop是一个静态分析器,它在.NET程序中查找编译器不会标记的常见问题。它的大多数警告都很模糊,很少是真正严重的问题,你需要把它当作一个“你想过这个吗?”的工具

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


    因此,FxCop指出,您没有对自己的异常派生类执行相同的操作。这实际上只是一个问题,如果你想让抛出异常的代码在另一个应用程序域中运行。FxCop在其他方面还不够聪明,无法知道您是否这样做,它只会在您这样做时提醒您出错。这是非常罕见的,所以当你还不知道你是否会这样做,或者对你来说这一切听起来是否像中文时,请随意忽略这个警告。

    在阅读了一些关于AppDomain Bounders的内容并对其进行了处理之后。NET确实开始给出自己的例外,说这些类没有[Serializable]。关于appDomain.CreateInstance(…,classNameForThisDomain,…)的一个有趣的点是,它在应用程序域中创建和运行classNameForThisDomain,而不是仅当此类派生自MarshalByRefObject时才在其中执行的应用程序域。但如果没有,则该域的classNameForThisDomain将加载到同一appdomain中!不是每个程序都使用AppDomains吗?From:“AppDomain实例用于加载和执行程序集。AppDomain类实现一组事件,使应用程序能够在加载程序集时响应”。听起来好像任何加载程序集的应用程序都使用AppDomains。而且,由于每个程序可能都会加载
    System.dll
    ,因此MSDN文档将暗示所有程序都使用应用程序域。@IanBoyd:我想我的观点是使用多个应用程序域,即创建自己的应用程序域。