2017-01-16 1 views
4

수학 함수를 사용하고 주어진 x에 대한 y 값을 계산하는 함수 플로터를 다시 작성하기 시작했습니다. 다시 쓰려면 IL을 사용하여 동적으로 메서드를 만들고 싶습니다. 필자가 지금 가지고있는 테스트 일리노이 코드는 2 LocalBuilders를 사용하고 그것을 곱합니다. 그러나, 내가 값을 반환하면, 난 진짜 대답 대신에 난수를 받는다.C#에서 IL 리턴이 잘못된 값을 반환합니다.

다음 코드를 사용하고 있습니다.

 ILGenerator il = hello.GetILGenerator(); 

     LocalBuilder a = il.DeclareLocal(typeof(int)); 
     LocalBuilder b = il.DeclareLocal(typeof(int)); 
     LocalBuilder multOfAandB = il.DeclareLocal(typeof(int)); 

     il.Emit(OpCodes.Ldc_I4, 5); // Store "5" ... 
     il.Emit(OpCodes.Stloc, a); // ... in "a". 

     il.Emit(OpCodes.Ldc_I4, 6); // Store "6" ... 
     il.Emit(OpCodes.Stloc, b); // ... in "b". 

     il.Emit(OpCodes.Ldloc, a); 
     il.Emit(OpCodes.Ldloc, b); 

     il.Emit(OpCodes.Mul);  // Multiply them ... 
     il.Emit(OpCodes.Ret);  // ... and return the result. 

이것은 30을 반환해야하지만 현재 4.2038953929744512E-44입니다. 함수가 잘못된 값을 반환하도록 만드는 코드에 문제가 있습니까? 다음과 같이 함수를 호출하는 코드는 사전

편집

에서

감사 :

 object[] invokeArgs = { 42 }; 
     object obj = func.helloMethod.Invoke(null, BindingFlags.ExactBinding, null, invokeArgs, new CultureInfo("en-us")); 

하고 나중에 FUNC에서 호출 할 수있는 기능을 저장할 내 수업에서

. helloMethod는 다음과 같이 정의되는 DynamicMethod를 가지고 있습니다 :

DynamicMethod hello = new DynamicMethod("Hello", 
      typeof(double), 
      helloArgs, 
      typeof(double).Module); 
+0

괜찮아요 ... 어떻게 검색하고 결과를 보여주고 있습니까 (특히'multOfAandB'가됩니까?), 코드의 해당 부분이 아닌 실행 문제가 의심 스럽습니다. 난수는 초기화되지 않은 메모리입니다. – dlatikay

+0

내 메인에서 @dlatikay 나는 'object [] invokeArgs = {42};를 호출하고 있습니다. 개체 obj = func.helloMethod.Invoke (null, BindingFlags.ExactBinding, null, invokeArgs, 새 CultureInfo ("en-us")); ' 내 동적 방법은 'DynamicMethod hello = new DynamicMethod ("Hello", typeof (double), helloArgs, typeof (double) .Module)입니다. 'DynamicMethod를 내 메인 + – Felix

+0

에서 호출하는 공용 변수에 저장하려고합니다. 나머지 호출 코드는 [this] (https://msdn.microsoft.com/en-us)와 유사하게 구성되어 있다고 가정 할 수 있습니다. /library/csx7wsz2(v=vs.110).aspx); 그리고 당신의 42는 결코 Ldarg_0'ed되지 않습니다 - 여전히 발신자/피 호출자 문제가 의심됩니다 – dlatikay

답변

3

int에서 반환 값을 실수로 double으로 강요하는 것 같습니다. 여기서 동적 인 실행은 놀랍게도 내결함성이 있습니다. 형식 불일치에 대한 검사가없는 것처럼 보입니다.

변경 호출 코드는 내부 지역 주민의 데이터 유형과 일치합니다 : 마지막 인수의 유형은 인수 데이터 유형의 클래스 이름이 아닌되어야한다고

var hello = new DynamicMethod(
    "Hello", 
    typeof(int), 
    helloArgs, 
    typeof(YourClassNameHere).Module 
); 

참고.

+0

CLR은 크기 여왕입니다. 그것은 그들의 타입보다 변수의 크기에 더 많은 신경을 쓴다 (당신이 가상 메소드 호출을하지 않는 한, 그렇다하더라도 ...) – hoodaticus

1

문제는 여기에 DynamicMethod의 정의했다 :

DynamicMethod hello = new DynamicMethod("Hello", 
     typeof(double), 
     helloArgs, 
     typeof(double).Module); 

5 * 6 이후 수익률 (30), INT, 그것은 이중의 INT를 변경하는 문제가 있었다 잘못된 대답을 돌려 보냈다. 일단 그것을 typeof (int)로 변경하면 리턴 값은 30이됩니다. 일리노이 타입이 너무 특별하다는 것을 알지 못했습니다.

관련 문제