C# - DynamicMethod 사용 시 System.TypeAccessException
지난 예제처럼 DynamicMethod를 사용하는 중에,
DynamicMethod dm = new DynamicMethod(
Guid.NewGuid().ToString(),
typeof(bool), [typeof(object)], typeof(Program), false);
특정 상황에서 이런 오류가 발생할 수 있습니다.
System.TypeAccessException
HResult=0x80131543
Message=Attempt by method 'DynamicClass.761a73f4-9126-4dd0-b3af-a5ff065f0d75(System.Object)' to access type 'System.Threading.Tasks.Task`1<MySql.Data.MySqlClient.MySqlPool>' failed.
이렇게 TypeAccessException가 발생하는 것은 DynamicMethod의 마지막 인자인 skipVisibility를 true로 주면 해결할 수 있습니다.
DynamicMethod dm = new DynamicMethod(
Guid.NewGuid().ToString(),
typeof(object), [typeof(object)], typeof(Program), true);
재현 코드가 좀 복잡해서 생략합니다. ^^;
CreateDelegate를 호출하는 중에,
resultFunc = (Func<object, bool>)dm.CreateDelegate(typeof(Func<object, object>));
"System.ArgumentException: 'Cannot bind to the target method because its signature is not compatible with that of the delegate type.'" 오류가 발생한다면?
뚫어지게 ^^ Signature를 확인해 보시면 됩니다. 간혹 (저처럼) 실수를 할 수도 있는데,
DynamicMethod dm = new DynamicMethod(
Guid.NewGuid().ToString(),
typeof(bool), [typeof(object)], typeof(Program), false);
resultFunc = (Func<object, bool>)dm.CreateDelegate(typeof(Func<object, object>));
저렇게 다른 signature를 부여했을 때 예외가 발생합니다. 자신의 코드를 의심하지 않으면 도대체 왜 저런 오류가 발생했는지 ^^; 파악이 어려운 경우입니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]