2017-03-17 9 views
0

Mono.Cecil을 사용하여 특정 메서드에 전달 된 모든 인수를 추출하려고합니다.
프로젝트가 빌드 된 직후 실행되는 사후 처리 스크립트에서 모든 메소드 호출을 찾고 함수에 전달 된 인수의 유형을 추출 할 수도 있습니다. 그러나 실제 가치를 얻을 수는 없습니다 ... Mono.Cecil에서도 마찬가지입니다. 그렇다면 어떤 가치를 볼 필요가 있습니까?Mono.Cecil을 사용하여 메서드 호출 인수 추출

여기에 내 현재 코드 :

List<MethodDefinition> methods = new List<MethodDefinition>(); 
foreach (ModuleDefinition _module in assembly.Modules) { 
    foreach (TypeDefinition _type in _module.Types) { 
     methods.AddRange (_type.Methods); 
    } 
} 
var uiExtensionMethod = methods 
     .Where(m => m.DeclaringType.Name == "SetCustomText").FirstOrDefault(); 
var instructions = uiExtensionMethod.Body.Instructions; 
var count = instructions.Count; 
var instructionArray = instructions.ToArray(); 
for (int i = 0; i < count; i++) { 
    if (instructionArray [i] != null) { 
     if (instructionArray [i].Operand != null) { 
      var paramType = instructionArray [i].Operand.ToString(); 
      // So here I have the type of the parameter, but I cannot get the value... 
     } 
    } 
} 
+0

값으로 무엇을 의미합니까? 'Console.WriteLine ("Hello")',''Hello "'는 값이 될 것입니까? 하지만 종종 계산됩니다 ...'string temp = "HELLO".ToLower(); Console.WriteLine (temp)'... 가장 쉬운 경우에는 거의 불가능한 문제를 해결하려고합니다. – xanatos

+0

Mono.Cecil을 사용하면 실행중인 프로그램이 아니라 dll을 볼 수 있습니다 ... 이는 시체를 해부하여 사람이 생각하는 것을 이해하려고하는 것과 같습니다. – xanatos

+0

나는이 사실을 완전히 알고 있습니다. 난 단지 "안녕하세요"와 함께 귀하의 예를 들어, 메서드의 호출을 직접해야합니다. 나는 dll을 보려고하는 것을 알고있다. ... – Tom

답변

0

좋아, 나는이에 대한 해결책을 발견했다.

Mono.Cecil이 내 메서드 호출을 실제로 찾았지만 인수가 이미 변수에 기록되어 파일로 변환되지 못하여 문자열로 변환 할 수없는 문제가있었습니다.

내 솔루션은 피연산자로 문자열이있는 모든 메서드를 구문 분석 한 다음 해당 NEXT 연산을 감지하는 것입니다. 다음 작업이 선택 기능이라면, 내가 찾고있는 문자열을 찾았습니다.