Получение из класса исключений: CA2237: Маркировать типы ISerializable с помощью параметра SerializableAttribute

Я вывел несколько классов из разных исключений. Теперь VS выдает предупреждение как в заголовке этого вопроса.

  1. Может ли кто-нибудь объяснить, что означает подавление этого правила?

  2. Не могли бы вы объяснить здесь правило, гласящее: "Не подавляйте предупреждение из этого правила для классов исключений, потому что они должны быть сериализуемыми для корректной работы в доменах приложения".?

PS Ну, я получил ответ сам. Вы действительно должны пометить исключения как сериализуемые. Они прекрасно работают без этого атрибута в том же AppDomain. Однако, если вы попытаетесь перехватить его из другого домена, его нужно будет сериализовать, чтобы пересечь границы приложения. И это главная причина, которую я нашел для этого.

Ответ 1

Это не совсем предупреждение Visual Studio, это предупреждение, созданное инструментом FxCop. Что вы можете запустить из меню VS Analyze. FxCop - это статический анализатор, который ищет общие ошибки в .NET-программе, которые компилятор не будет отмечать. Большинство его предупреждений довольно неясны и редко являются действительно серьезными проблемами, вам нужно рассматривать это как "вы подумали об этом?". вид инструмента.

Небольшой факт, который он пытается вам напомнить, заключается в том, что класс Exception реализует ISerializable и имеет атрибут [Serializable]. Что является довольно сложным требованием, он делает базовый объект Exception сериализуемым в доменах приложений. Необходимо, потому что исключение не происходит из MarshalByRefObject. И необходимо разрешить код, который вы запускаете в другом домене приложения, чтобы генерировать исключения, которые вы можете уловить.

Итак, FxCop отмечает, что вы не сделали то же самое для своего собственного производного класса Exception. Это действительно проблема только в том случае, если вы когда-либо намереваетесь иметь код, который заставляет исключение запускаться в другом домене приложения. FxCop не настолько умен, чтобы знать, если вы это сделаете, это может только напомнить вам, что это пойдет не так, когда вы это сделаете. Это довольно необычно, поэтому не стесняйтесь игнорировать предупреждение, когда вы еще не знаете, будете ли вы или нет, или все это звучит как китайский для вас.

Ответ 2

Если вы не собираетесь использовать несколько приложений AppDomain в своем приложении, я думаю, вы можете игнорировать его или подавлять.