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

(시리즈 글이 9개 있습니다.)
.NET Framework: 216. 라이선스까지도 뛰어넘는 .NET Profiler
; https://www.sysnet.pe.kr/2/0/1046

.NET Framework: 336. .NET Profiler가 COM 개체일까?
; https://www.sysnet.pe.kr/2/0/1352

.NET Framework: 576. 기본적인 CLR Profiler 소스 코드 설명
; https://www.sysnet.pe.kr/2/0/10950

.NET Framework: 582. CLR Profiler - 별도 정의한 .NET 코드를 호출하도록 IL 코드 변경
; https://www.sysnet.pe.kr/2/0/10959

.NET Framework: 808. .NET Profiler - GAC 모듈에서 GAC 비-등록 모듈을 참조하는 경우의 문제
; https://www.sysnet.pe.kr/2/0/11810

오류 유형: 672. AllowPartiallyTrustedCallers 특성이 적용된 어셈블리의 struct 멤버 메서드를 재정의하면 System.Security.VerificationException 예외 발생
; https://www.sysnet.pe.kr/2/0/12384

.NET Framework: 987. .NET Profiler - FunctionID와 연관된 ClassID를 구할 수 없는 문제
; https://www.sysnet.pe.kr/2/0/12465

.NET Framework: 1041. C# - AssemblyID, ModuleID를 관리 코드에서 구하는 방법
; https://www.sysnet.pe.kr/2/0/12605

닷넷: 2228. .NET Profiler - IMetaDataEmit2::DefineMethodSpec 사용법
; https://www.sysnet.pe.kr/2/0/13576




AllowPartiallyTrustedCallers 특성이 적용된 어셈블리의 struct 멤버 메서드를 재정의하면 System.Security.VerificationException 예외 발생

이전 몇몇 글에서도 "System.Security.VerificationException" 예외 관련한 사례를 소개한 적이 있습니다.

AllowPartiallyTrustedCallers 특성이 적용된 GAC 어셈블리에서 DynamicMethod의 calli 명령어 사용
; https://www.sysnet.pe.kr/2/0/10809

C# - 포인터를 쓰는 경우 VerificationException이 발생한다면?
; https://www.sysnet.pe.kr/2/0/10854

위의 2가지 사례 모두 APTCA 특성이 적용된 어셈블리와 관련이 있는데요, 재미있는 것은, CLR Profiler를 다루는 경우 APTCA와 관련되면서도 위의 링크에서 소개한 문제들과는 약간 다른 문제가 발생합니다. 예전에 Profiler를 이용해 외부 C# 어셈블리의 메서드를 호출하도록 rewrite 하는 코드를 설명했는데,

CLR Profiler - 별도 정의한 .NET 코드를 호출하도록 IL 코드 변경
; https://www.sysnet.pe.kr/2/0/10959

위와 같은 식으로 APTCA 어셈블리에 있는 struct 타입의 메서드를 대상으로 외부 메서드를 호출하도록 rewrite 시키면 안 된다는 (공식적인 문서의 기록을 찾을 수 없는) 제약이 있습니다. 만약 rewrite하게 되면 실행 시에 다음과 같은 식으로 System.Security.VerificationException 예외가 발생합니다.

Operation could destabilize the runtime

System.Security.VerificationException: 작업으로 인해 런타임이 불안정해질 수 있습니다.
위치: Newtonsoft.Json.Serialization.ResolverContractKey.GetHashCode()
위치: System.Collections.Generic.GenericEqualityComparer`1.GetHashCode(T obj)
위치: System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
위치: System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value)
위치: Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(Type type)
위치: Newtonsoft.Json.Serialization.JsonSerializerInternalReader.GetContractSafe(Type type)
위치: Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)

실제로 위의 오류 메시지는 Newtonsoft의 JSON.NET에 struct 타입의 메서드가 rewrite되었을 때 발생한 것입니다. 검색해 보면, 이와 유사한 문제를 겪는 CLR Profiler 이슈를 볼 수 있는데요,

Profiling SecurityTransparent and partially-trusted assemblies
; https://documentation.red-gate.com/display/APP8/Profiling+SecurityTransparent+and+partially-trusted+assemblies

즉, "ANTS Performance Profiler 8"의 경우 아예 JSON.NET을 비롯한 잘 알려진 패키지 중 APTCA가 적용되었다면 "block list"에 포함시켜 관리를 하고 있습니다.




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







[최초 등록일: ]
[최종 수정일: 10/27/2020]

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

비밀번호

댓글 작성자
 




... 106  107  108  109  110  111  112  113  114  [115]  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11049정성태9/24/201620893오류 유형: 357. 윈도우 백업 시 오류 - 0x81000037
11048정성태9/24/201621882VC++: 100. 전역 변수 유형별 실행 파일 크기 차이점
11047정성태9/21/201625738기타: 61. algospot.com - 양자화(Quantization) 문제 [2]파일 다운로드1
11046정성태9/15/201627347개발 환경 구성: 298. Windows 10 - bash 실행 시 시작 디렉터리 자동 변경
11045정성태9/15/201620035Windows: 119. Windows 10 - bash 명령어 창을 실행했는데 바로 닫히는 경우
11044정성태9/15/201620294VS.NET IDE: 112. Visual Studio 확장 - 편집 화면 내에서 링크를 누르면 외부 웹 브라우저에서 열기
11043정성태9/15/201621706.NET Framework: 606. .NET 스레드 콜 스택 덤프 (7) - ClrMD(Microsoft.Diagnostics.Runtime)를 이용한 방법 [1]파일 다운로드1
11042정성태9/14/201619866오류 유형: 356. Unknown custom metadata item kind: 6
11041정성태9/10/201619342.NET Framework: 605. CLR4 보안 - yield 구문 내에서 SecurityCritical 메서드 사용 불가 - 2번째 이야기
11040정성태9/10/201626651.NET Framework: 604. C# Windows Forms - Drag & Drop 예제 코드 [2]파일 다운로드1
11039정성태9/9/201623159오류 유형: 355. Visual Studio 빌드 오류 - error CS0122: '__ComObject' is inaccessible due to its protection level
11038정성태9/9/201624966VC++: 99. 서로 다른 프로세스에서 WM_DROPFILES 메시지를 전송하는 방법파일 다운로드1
11037정성태9/8/201628227.NET Framework: 603. socket - shutdown 호출이 필요한 사례파일 다운로드1
11036정성태8/29/201624722개발 환경 구성: 297. 소스 코드가 없는 닷넷 어셈블리를 디버깅할 때 지역 변숫값을 확인하는 방법
11035정성태8/29/201620370오류 유형: 354. .NET Reflector - PDB 생성 화면에서 "Clear Store"를 하면 "Index and length must refer to a location within the string" 예외 발생
11034정성태8/25/201624413개발 환경 구성: 296. .NET Core 프로젝트를 NuGet Gallery에 배포하는 방법 [2]
11033정성태8/24/201622252오류 유형: 353. coreclr 빌드 시 error C3249: illegal statement or sub-expression for 'constexpr' function
11032정성태8/23/201621457개발 환경 구성: 295. 최신의 Visual C++ 컴파일러 도구를 사용하는 방법 [1]
11031정성태8/23/201617716오류 유형: 352. Error encountered while pushing to the remote repository: Response status code does not indicate success: 403 (Forbidden).
11030정성태8/23/201620259VS.NET IDE: 111. Team Explorer - 추가한 Git Remote 저장소가 Branch에 보이지 않는 경우
11029정성태8/18/201627391.NET Framework: 602. Process.Start의 cmd.exe에서 stdin만 redirect 하는 방법 [1]파일 다운로드1
11028정성태8/15/201621487오류 유형: 351. Octave 설치 시 JRE 경로 문제
11027정성태8/15/201622555.NET Framework: 601. ElementHost 컨트롤의 메모리 누수 현상
11026정성태8/13/201623525Math: 19. 행렬 연산으로 본 해밍코드
11025정성태8/12/201622205개발 환경 구성: 294. .NET Core 프로젝트에서 "Copy to Output Directory" 처리 [1]
11024정성태8/12/201621517오류 유형: 350. "nProtect GameMon" 실행 중에는 Visual Studio 디버깅이 안됩니다! [1]
... 106  107  108  109  110  111  112  113  114  [115]  116  117  118  119  120  ...