Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 3개 있습니다.)
.NET Framework: 407. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드
; https://www.sysnet.pe.kr/2/0/1580

.NET Framework: 455. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/1735

.NET Framework: 527. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 세 번째 이야기
; https://www.sysnet.pe.kr/2/0/10842




닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 세 번째 이야기

닷넷 4.0에서 바뀐 보안 정책으로 인해 예외 클래스의 최소 구현 코드에 변화가 있습니다.

닷넷 사용자 정의 예외 클래스의 최소 구현 코드
; https://www.sysnet.pe.kr/2/0/1580

닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/1735

가령, 닷넷 4.0 어셈블리에 APTCA를 부여한 경우,

[assembly: AllowPartiallyTrustedCallers]

.NET CLR4 보안 모델 - 3. CLR4 보안 모델에서의 APTCA 역할
; https://www.sysnet.pe.kr/2/0/1682

사용자 정의 예외 타입을 이렇게 구현하면,

using System;
using System.Runtime.Serialization;

namespace TestApp
{
    [Serializable]
    public class MyException : System.Exception, ISerializable
    {
        public MyException()
        {
        }

        public MyException(string message) : base(message)
        {
        }

        public MyException(string message, Exception innerException)
            : base(message, innerException)
        {
        }

        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }

        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            base.GetObjectData(info, context);
        }
    }
}

다음과 같은 예외가 발생합니다.

System.TypeLoadException occurred
  HResult=-2146233054
  Message=Inheritance security rules violated while overriding member: 'TestApp.MyException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Security accessibility of the overriding method must match the security accessibility of the method being overriden.
  Source=TestApp
  TypeName=TestApp.MyException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)
  StackTrace:
       at TestApp.MyMethod()
  InnerException: 

이 예외가 다소 황당한데요. System.TypeLoadException이기 때문에 디버깅 도중 F9(Step-Into) 기능으로도 문제의 코드까지 진입을 하지 못합니다. 따라서 위의 오류 메시지를 이해하지 못하면 정확히 왜 이런 문제가 발생하는지 파악조차 못할 수가 있는데요.

문제의 원인은, 닷넷 4.0의 보안 모델에 따라 상속받은 메서드에 지정된 "security accessibility" 특성이 반드시 부모 클래스의 가상 메서드에 지정된 것과 일치해야 한다는 점입니다. 확인을 위해 System.Exception 예외를 .NET Reflector로 확인해 보면 GetObjectData에 SecurityCritical 특성이 부여된 것을 볼 수 있습니다.

namespace System
{
    public class Exception : ISerializable, _Exception
    {
        // ...[생략]...
        [SecurityCritical]
        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
        // ...[생략]...
    }
}

따라서, 닷넷 4.0에서의 예외 클래스는 APTCA를 고려해 다음과 같이 예외 클래스를 정의해야 합니다.

using System;
using System.Runtime.Serialization;

namespace TestApp
{
    [Serializable]
    public class MyException : System.Exception, ISerializable
    {
        public MyException()
        {
        }

        public MyException(string message) : base(message)
        {
        }

        public MyException(string message, Exception innerException)
            : base(message, innerException)
        {
        }

        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }

        [SecurityCritical]
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            base.GetObjectData(info, context);
        }
    }
}





[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 2/1/2020]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 16  17  18  19  20  [21]  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13415정성태9/18/202311857닷넷: 2144. C# 12 - 컬렉션 식(Collection Expressions) [2]
13414정성태9/16/202311197디버깅 기술: 193. Windbg - ThreadStatic 필드 값을 조사하는 방법
13413정성태9/14/202312033닷넷: 2143. C# - 시스템 Time Zone 변경 시 이벤트 알림을 받는 방법
13412정성태9/14/202315518닷넷: 2142. C# 12 - 인라인 배열(Inline Arrays) [1]
13411정성태9/12/202311826Windows: 252. 권한 상승 전/후 따로 관리되는 공유 네트워크 드라이브 정보 [1]
13410정성태9/11/202313302닷넷: 2141. C# 12 - Interceptor (컴파일 시에 메서드 호출 재작성) [1]
13409정성태9/8/202312601닷넷: 2140. C# - Win32 API를 이용한 모니터 전원 끄기
13408정성태9/5/202312172Windows: 251. 임의로 만든 EXE 파일을 포함한 ZIP 파일의 압축을 해제할 때 Windows Defender에 의해 삭제되는 경우
13407정성태9/4/202311999닷넷: 2139. C# - ParallelEnumerable을 이용한 IEnumerable에 대한 병렬 처리
13406정성태9/4/202311793VS.NET IDE: 186. Visual Studio Community 버전의 라이선스
13405정성태9/3/202312909닷넷: 2138. C# - async 메서드 호출 원칙
13404정성태8/29/202313044오류 유형: 876. Windows - 키보드의 등호(=, Equals sign) 키가 눌리지 않는 경우
13403정성태8/21/202311689오류 유형: 875. The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EB3E94ADBE1229CF
13402정성태8/20/202311898닷넷: 2137. ILSpy의 nuget 라이브러리 버전 - ICSharpCode.Decompiler
13401정성태8/19/202311866닷넷: 2136. .NET 5+ 환경에서 P/Invoke의 성능을 높이기 위한 SuppressGCTransition 특성 [1]
13400정성태8/10/202311546오류 유형: 874. 파이썬 - pymssql을 윈도우 환경에서 설치 불가
13399정성태8/9/202310463닷넷: 2135. C# - 지역 변수로 이해하는 메서드 매개변수의 값/참조 전달
13398정성태8/3/202313451스크립트: 55. 파이썬 - pyodbc를 이용한 SQL Server 연결 사용법
13397정성태7/23/202312510닷넷: 2134. C# - 문자열 연결 시 string.Create를 이용한 GC 할당 최소화
13396정성태7/22/202311909스크립트: 54. 파이썬 pystack 소개 - 메모리 덤프로부터 콜 스택 열거
13395정성태7/20/202311152개발 환경 구성: 685. 로컬에서 개발 중인 ASP.NET Core/5+ 웹 사이트에 대해 localhost 이외의 호스트 이름으로 접근하는 방법
13394정성태7/16/202310484오류 유형: 873. Oracle.ManagedDataAccess.Client - 쿼리 수행 시 System.InvalidOperationException
13393정성태7/16/202311212닷넷: 2133. C# - Oracle 데이터베이스의 Sleep 쿼리 실행하는 방법
13392정성태7/16/202310804오류 유형: 872. Oracle - ORA-01031: insufficient privileges
13391정성태7/14/202311186닷넷: 2132. C# - sealed 클래스의 메서드를 callback 호출했을 때 인라인 처리가 될까요?
13390정성태7/12/202311135스크립트: 53. 파이썬 - localhost 호출 시의 hang 현상
... 16  17  18  19  20  [21]  22  23  24  25  26  27  28  29  30  ...