2016-06-24 1 views
2

를 반환 INT32은 [] 특급 (INT32은 [])마이크로 소프트 중간 언어 코드 [MSIL] 어레이 내가 서명 MethodBuilder를 이용한 동적 인 방법을 만든 통과하고

은 출사 코드

Type[] myMthdParams = new Type[1]; 
myMthdParams[index] = typeof(int[]); 
MethodBuilder myMthdBld = myTypeBld.DefineMethod("Exp",MethodAttributes.Public |MethodAttributes.Static, typeof(int[]),mthdParams);           
ILGenerator ILout = myMthdBld.GetILGenerator(); 
ILout.Emit(OpCodes.Ldarg_1);    
ILout.Emit(OpCodes.Stloc_0);  
ILout.Emit(OpCodes.Ldloc_0); 
ILout.Emit(OpCodes.Ret); 
다음과 같다 다음과 같이

내가 구현하고자하는 방법은 다음과 같습니다 나는 오류를 얻고있다

int[] Exp(int[] arr) 
{ 
    return arr; 
} 

CLR은 잘못된 프로그램을 발견했습니다. 나는 그것을 잘못하고있다? 도움을 주시면 감사하겠습니다.

+0

당신이'MethodBuilder'을 포함 전체 코드를 보여줄 수 :

ILGenerator ILout = myMthdBld.GetILGenerator(); ILout.Emit(OpCodes.Ldarg_1); ILout.Emit(OpCodes.Ret); 

또는 방법은 정적 인 경우

(그리고 따라서는 첫 번째 인수로 this이 없음)? – thehennyy

답변

5

stlocldloc은 첫 번째 로컬에 저장 한 다음로드합니다.

int[] Exp(int[] arr) 
{ 
    var temp = arr; 
    return temp; 
} 

을하지만 tempDeclareLocal()를 사용하는 것을 정의하지 않은 경우 그것은 더 같은이다 : 그것은 조금 코드의 존재처럼 당연히 무효

int[] Exp(int[] arr) 
{ 
    temp = arr; 
    return temp; 
} 

(temp없이 정의).

어쨌든 임시 로컬이 필요하지 않습니다 (디버깅을 돕기 위해 C#의 디버그 컴파일에 종종 포함되지만). 왜 그냥 :

ILGenerator ILout = myMthdBld.GetILGenerator(); 
ILout.Emit(OpCodes.Ldarg_0);    
ILout.Emit(OpCodes.Ret); 
+0

이것은 효과가 있습니다. 정적 메소드입니다. 그래서 Ldarg_0와 함께 일했습니다. 고마워요! – badari

관련 문제