CLR4 보안 - yield 구문 내에서 SecurityCritical 메서드 사용 불가 - 2번째 이야기
예전에도 yield 관련 구문해서 보안 오류 발생하는 것을 기록했었는데요.
CLR4 보안 - yield 구문 내에서 SecurityCritical 메서드 사용 불가
; https://www.sysnet.pe.kr/2/0/1683
이번에는 yield를 사용한 메서드 안에서 finally를 사용했을 때의 보안 오류에 대한 콜 스택을 적어봅니다. ^^
Exception thrown: 'System.MethodAccessException' in [...].dll
Additional information: Attempt by security transparent method 'Microsoft.Diagnostics.Runtime.Desktop.DesktopRuntimeBase+<EnumerateStackFrames>d__80.<>m__Finally1()' to access security critical method 'System.Runtime.InteropServices.Marshal.FinalReleaseComObject(System.Object)' failed.
Assembly 'TestLibrary, Version=5.1.2.1, Culture=neutral, PublicKeyToken=cc862a9be44088eb' is marked with the AllowPartiallyTrustedCallersAttribute, and uses the level 2 security transparency model. Level 2 transparency causes all methods in AllowPartiallyTrustedCallers assemblies to become security transparent by default, which may be the cause of this exception.
그런데, 왠지 이번에는 해당 메서드를 yield에서 IEnumerable, IEnumerator 구현 구조로 바꾸기 귀찮았습니다. 그러면서 ^^ 한 가지 요령이 생각났는데요. 어차피 yield로 자동 생성된 메서드가 SecuritySafeCritical 특성을 적용할 수 없어 그런 문제가 발생한 것이기 때문에, 그냥 그 부분만 다른 메서드로 감싸면 되지 않을까 하는... 겁니다. ^^
그러니까 지난 예제를 보면,
using System.Security;
using System.IO;
using System.Collections.Generic;
[assembly: AllowPartiallyTrustedCallers]
public class SecurityService
{
// ... [생략: GetFileHandle] ...
[SecuritySafeCritical]
public static IEnumerable GetList(FileStream fs)
{
yield return fs.Handle.ToInt64();
}
}
이런 식으로 바꿔도 되었던 것입니다. ^^
using System.Security;
using System.IO;
using System.Collections.Generic;
[assembly: AllowPartiallyTrustedCallers]
public class SecurityService
{
// ... [생략: GetFileHandle] ...
public static IEnumerable GetList(FileStream fs)
{
long handle = GetHandleValue(fs);
yield return handle;
}
[SecuritySafeCritical]
long GetHandleValue(FileStream fs)
{
return fs.Handle.ToInt64();
}
}
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]