2012-07-04 8 views
8

さまざまな例外からいくつかのクラスを派生させました。今はこの質問のタイトルのように警告を出します。例外クラスから派生する警告:CA2237:SerializableAttributeでISerializable型をマークする

1.誰かがこのルールを抑制することの意味を説明できますか?

hereからルールを説明することができますか?「アプリケーションクラスター間で正しく動作するためには直列化可能でなければならないため、このルールから警告を抑制しないでください。

ありがとうございました。

P.S.さて、私は自分自身で答えを得ました。実際には、例外をシリアライズ可能としてマークする必要があります。同じAppDomainでこの属性がなくても正常に動作します。しかし、他のドメインからキャッチしようとすると、アプリの境界を越えて取得するためにはシリアル化されなければなりません。それが私がこれで見つけた主な理由です。

答えて

12

これはVisual Studioの警告ではありません.FxCopツールによって生成される警告です。 VS Analyzeメニューから実行できます。 FxCopは、コンパイラがフラグを立てない.NETプログラムで一般的な問題を探すスタティックアナライザです。その警告の大部分はかなりわかりにくく、まれには本当に深刻な問題ではありません。あなたはこれを「これを考えましたか?ツールの種類。

ここであなたに思い出させる少しの事実は、ExceptionクラスがISerializableを実装し、[Serializable]属性を持っていることです。これは非常に厳しい要件ですが、基本的なExceptionオブジェクトをapp-domains全体でシリアライズ可能にします。例外はMarshalByRefObjectから派生しないため必要です。また、別のアプリドメインで実行するコードで、キャッチできる例外をスローする必要があります。

だからFxCopは、あなた自身のException派生クラスで同じことをしていないことに注意しています。あなたの例外が別のapp-domainで実行されるようなコードを作ろうと思っているのであれば、本当に問題になります。そうでなければ、FxCopはあなたがそうしているかどうかを知るのに十分スマートではありません。それはかなり珍しいので、もしあなたがそうするかどうか、あるいはあなたに中国語のように聞こえるかどうかまだ分かっていないときに、警告を無視するように自由に感じてください。

+0

AppDomainの境界で何か読んで遊んだ後.NETは実際にはこれらのクラスに[Serializable]がないという独自の例外を与え始めました。 appDomain.CreateInstance(...、classNameForThisDomain、...)に関する興味深い点の1つは、このクラスがMarshalByRefObjectから派生したときにのみ実行しているappドメインとは別のappドメインにclassNameForThisDomainを作成して実行することです。しかしそうでなければ、classNameForThisDomainは同じappdomainにロードされます! – Nickolodeon

0

アプリケーションで複数のAppDomainを使用しない場合は、無視するか抑制することができます。

+0

すべてのプログラムがAppDomainsを使用しているわけではありませんか? [System.AppDomain'のMSDNドキュメント](https://msdn.microsoft.com/en-us/library/system.appdomain.aspx)から:* "AppDomainインスタンスは、アセンブリのロードと実行に使用されます。AppDomainクラスアセンブリがロードされたときにアプリケーションが応答できるようにする一連のイベントを実装します。アセンブリをロードするすべてのアプリケーションがAppDomainsを使用するように思えます。そして、すべてのプログラムがおそらく 'System.dll'をロードするので、MSDNのドキュメントはすべてがアプリケーションドメインを使用することを暗示します。 –

+0

@IanBoyd:私の主張は、1つ以上のアプリドメインを使用すること、つまり自分で作成することだと思います。 – abatishchev

関連する問題