2011-08-28 1 views
1

초기화 :모노 세실 - 나는 다음과 같은 방법이 지역 변수

public void DoSomething() 
{ 
    Console.WriteLine(""); 
} 

내가 모노 세실이 코드를 수정할합니다. 나는 방법 내에서 사용자 정의 클래스의 인스턴스를 만들려면 :

public void DoSomething() 
{ 
    MyClass instance = new MyClass(); 
    Console.WriteLine(""); 
} 

현재 나는 다음과 같은 코드를 사용 : 변경 사항을 적용한 후

var constructorInfo = typeof(MyClass).GetConstructor(new Type[] { }); 
    MethodReference myClassConstructor = targetAssembly.MainModule.Import(constructorInfo); 

    var processor = targetMethod.Body.GetILProcessor(); 
    var firstInstruction = targetMethod.Body.Instructions[1]; 

    var instructions = new List<Instruction>() { 
     processor.Create(OpCodes.Newobj, myClassConstructor), 
     processor.Create(OpCodes.Stloc_0) 
    }; 

    foreach (var instruction in instructions) 
    { 
     processor.InsertBefore(firstInstruction, instruction); 
    } 

을, 프로그램이 잘못하고 실행할 수 없습니다. 내가 생성 된 코드를보고 'IL DASM'를 사용하는 경우 다음 문이 없습니다 : 내가 직접 전체 코드를 컴파일하는 것처럼

.locals init ([0] class [MyAssembly]MyNamespace.MyClass instance) 

일리노이의 나머지는 동일합니다. 내가 뭘 잘못하고 있는지 아이디어가 있으십니까?

답변

3

나는 그것을 시도하지는 않았지만 Cecil 소스 코드를보고 먼저 MethodBody의 일부인 로컬 변수를 만들어야합니다.

MethodBody는 그런 다음 호출 할 필요가

body.Variables.Add(new VariableDefinition(typedef)) 

를 통해 충전 할 수있는 Variables 컬렉션이 트릭을 할해야

processor.Create(xxx,indexto local variable);. 내가 볼 수 없었던 유일한 방법은 TypeDefinitionType에서 찾아내는 방법입니다. 이 접근법을 사용하려면 먼저 Mono Cecil에 어셈블리를로드해야한다고 생각합니다.

+0

도움 주셔서 감사합니다. 변수를 추가 할 수있었습니다. 내가 아직 해당 생성자에 대한 호출로 초기화하는 데 문제가있다. – Daniel