2013-08-11 1 views
1

오늘, DynamicMethod 클래스에 대해 배우기 시작했습니다. 학습 목적으로 DynamicMethod를 사용하여 인수를 사용하지 않고 항상 부울 값 true을 반환하는 함수를 만들려고했습니다.DynamicMethod를 사용하여 항상 true를 반환하는 메서드를 만들 때 오류가 발생합니다.

C#에서이 작업을 수행하는 함수를 만든 다음 Telerik JustDecompile로 IL 코드를 검사했습니다.

.method public hidebysig instance bool ReturnTrue1() cil managed 
{ 
    .locals init (
     [0] bool CS$1$0000 
    ) 

    IL_0000: nop 
    IL_0001: ldc.i4.1 
    IL_0002: stloc.0 
    IL_0003: br.s IL_0005 

    IL_0005: ldloc.0 
    IL_0006: ret 
} 

아주 간단 해 보입니다. 설명서에 따르면이 명령어는 반환 할 스택에 정수 1을 배치하는 것처럼 보입니다.

내가 본 예제 중 일부를 살펴보면 다음과 같은 콘솔 응용 프로그램을 작성했습니다. 이 코드를 실행하면

using System; 
using System.Reflection.Emit; 

namespace EntityFrameworkDynamicMethod 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     {    
      ReturnTrue ReturnTrueDelegate = GetReturnTrueDelegate(); 
      ReturnTrueDelegate();    
     }   

     delegate bool ReturnTrue(); 

     static ReturnTrue GetReturnTrueDelegate() 
     {    
      DynamicMethod method = new DynamicMethod("ReturnTrue", typeof(bool), new Type[] {}); 
      ILGenerator generator = method.GetILGenerator(); 
      Label IL_0005 = generator.DefineLabel(); 
      generator.Emit(OpCodes.Nop); 
      generator.Emit(OpCodes.Ldc_I4_1); 
      generator.Emit(OpCodes.Stloc_0);    
      generator.Emit(OpCodes.Ldloc_0, IL_0005);    
      generator.MarkLabel(IL_0005); 
      generator.Emit(OpCodes.Ret); 

      return (ReturnTrue)method.CreateDelegate(typeof(ReturnTrue)); 
     } 
    } 
} 

그러나, 다음과 같은 예외는 무엇을이 예외를 의미합니까 내가이 문제를 해결하기 위해 무엇을해야합니까 ReturnTrueDelegate();

System.Security.VerificationException: Operation could destabilize the runtime. 
at ReturnTrue() 

에서 발생할?

답변

4
generator.Emit(OpCodes.Ldloc_0, IL_0005); 

올바르지 않습니다. ldloc.0 명령어에는 인수가 없습니다 (br.s을 의미 했습니까?).
또한 선언하지 않고 로컬 0을 사용할 수 없습니다.

그러나 아무 것도 필요하지 않습니다. 로드가 1 (ldc.i4.1)이면 반환하고 (ret) 반환하면됩니다.
릴리스 모드 코드를 디 컴파일하면이를 볼 수 있습니다.

+0

아 그래, 나는 디버그 모드에서 디 컴파일했다. 나는 그것을 먼저 놓으려고 생각하지 않았다. –

관련 문제