2012-07-04 1 views
8

여러 가지 예외에서 여러 클래스를 파생 시켰습니다. 이제 vs는이 질문의 제목 에서처럼 경고를줍니다.예외 클래스에서 파생 경고 : CA2237 : SerializableAttribute를 사용하여 ISerializable 유형을 표시하십시오.

1.이 규칙을 무시한 것의 의미를 설명 할 수 있습니까?

here에서 규칙을 설명 할 수 있습니까? "응용 프로그램 도메인에서 올바르게 작동하려면 직렬화 가능해야하므로 예외 클래스에 대한 경고를 표시하지 마십시오."

감사합니다.

P. 글쎄, 나 스스로 대답을 얻었 어. 실제로 예외를 직렬화 가능으로 표시해야합니다. 동일한 AppDomain에서이 특성 없이는 제대로 작동합니다. 그러나 당신이 다른 도메인에서 그것을 잡으려고하면, 그것은 응용 프로그램 경계를 가로 질러 얻을 serialize해야합니다. 이것이 제가 찾은 주된 이유입니다.

답변

12

이것은 Visual Studio 경고가 아니므로 FxCop 도구에서 생성 된 경고입니다. VS Analyze 메뉴에서 실행할 수 있습니다. FxCop은 .NET 프로그램에서 컴파일러가 플래그하지 않는 공통적 인 문제를 찾는 정적 분석기입니다. 그것의 경고의 대부분은 꽤 애매하고 거의 심각한 문제가 아니기 때문에 이것을 "당신이 생각 했습니까?" 도구의 종류.

여기에서 당신을 상기시키려는 작은 사실은 Exception 클래스가 ISerializable을 구현하고 [Serializable] 특성을 가지고 있다는 것입니다. 어느 것이 꽤 어려운 요구 사항이며, 기본 Exception 객체가 app-domains에 대해 직렬화 가능하게 만듭니다. Exception은 MarshalByRefObject에서 파생되지 않기 때문에 필요합니다. 그리고 당신이 잡을 수있는 예외를 던지기 위해 다른 앱 도메인에서 실행하는 코드를 허용해야합니다.

그래서 FxCop은 사용자가 Exception 파생 클래스에 대해 동일한 작업을 수행하지 않았다는 것을 나타냅니다. 예외를 throw하는 코드를 다른 app-domain에서 실행하려는 경우 실제로 문제가 될 수 있습니다. 그렇지 않으면 FxCop은 당신이 그렇게 할 때 잘못되었다는 것을 상기시켜 줄 수있을만큼 충분히 똑똑하지 않습니다. 꽤 드문 일이므로 경고 여부는 당신이 알지 못하는지 또는 무시할 것인지, 아니면 모두 중국인처럼 들릴지 모를 때 무시하십시오.

+0

AppDomain 경계를 가지고 독서하고 놀고 난 후에 .NET은 실제로 이러한 클래스에 [Serializable]이 없다는 자체 예외를 제공하기 시작했습니다. appDomain.CreateInstance (..., classNameForThisDomain, ...)에 대한 흥미로운 점 중 하나는이 클래스가 MarshalByRefObject에서 파생 될 때만 실행중인 앱 도메인과 별개의 app 도메인에 classNameForThisDomain을 만들고 실행한다는 것입니다. 하지만 그렇지 않으면 classNameForThisDomain이 동일한 appdomain에로드됩니다! – Nickolodeon

0

응용 프로그램에서 여러 AppDomain을 사용하지 않을 경우 해당 응용 프로그램을 무시하거나 억제 할 수 있다고 생각합니다.

+0

모든 프로그램이 AppDomains를 사용하지는 않습니까? [MSDN 문서 'System.AppDomain'] (https://msdn.microsoft.com/en-us/library/system.appdomain.aspx) : * "AppDomain 인스턴스는 어셈블리를로드하고 실행하는 데 사용됩니다. AppDomain 클래스 어셈블리가로드 될 때 응용 프로그램이 응답 할 수있게하는 일련의 이벤트를 구현합니다. 어셈블리를로드하는 응용 프로그램에서 AppDomains를 사용하는 것처럼 들립니다. 모든 프로그램이'System.dll'을로드 할 것이기 때문에 MSDN 문서는 모든 것이 앱 도메인을 사용한다는 것을 암시합니다. –

+0

@IanBoyd : 내 포인트는 1 개 이상의 앱 도메인을 사용하는 것, 즉 자신 만의 앱 도메인을 만드는 것이 었습니다. – abatishchev