2010-05-27 6 views
3

어셈블리 광산 (사용자 정의 인증을 사용)을 사용하는 aspx 웹 페이지가 있습니다. 파일에 무엇인가를 기록하기 위해 내 어셈블리의 MSIL 코드 (ILDASM/ILASM 도구로만)를 수정하고 싶습니다.MSIL 코드로 파일을 작성하는 방법

나는 나의 어셈블리의위한 인증 방법의 끝이를 추가하는 시도 :

IL_0034: ldstr  "C:\\path_to_my_website\\log.txt" 
IL_0039: newobj  instance void [mscorlib]System.IO.StreamWriter::.ctor(string) 
IL_003e: stloc.1 
IL_003f: ldloc.1 
IL_0040: ldstr  "test" 
IL_0045: callvirt instance void [mscorlib]System.IO.TextWriter::Write(string) 
IL_004a: nop 
IL_004b: ldloc.1 
IL_004c: callvirt instance void [mscorlib]System.IO.TextWriter::Close() 
IL_0051: nop 

이 ILASM가 오류를 발견하지 않으며, CLR 런타임에 예외를 throw하지 않습니다,하지만 파일입니다 생성되거나 수정되지 않았습니다! :(

가 어떤 생각?

+0

어셈블리 인 경우 실제 코드에 로깅을 추가하면 어떻습니까? –

+3

MSIL 코드를 배우기 때문에 마지막 목적은 훨씬 까다 롭습니다. – Thomas

+0

'Close()'전에'Flush()'를 호출 해 보았습니까? 일부 스트림은 닫을 때 플러시되지 않습니다. 약간 바보입니다. – thecoop

답변

2

체크 아웃 Mono.Cecil을. 그것의 그 내용과 일 처리하고, 그 결과를 저장, 파일로 어셈블리를로드를위한 것. 특히 this example은 기존의 조립 방법에 디버그 추적을 추가합니다.

+1

Cecil은 런타임이 .net 인 경우에도 작동한다고 생각합니다. – CodesInChaos

+0

@CodeInChoas : 예. Mono.Cecil은 Mono 및 .net에서 똑같이 잘 실행됩니다. –

1

몇 가지 생각하십시오 ret 명령 (또는 다른 도달 할 수없는 위치), 그래서 아무 것도 우연하지 않습니다 후

  • 는 말 그대로 방법의 끝까지 IL 것을 추가 한 경우, 그것은 모든 것 펜 (그리고 일리노이는 아마 유효하지 않을 것이다). 어셈블리에서 peverify를 실행하여 유효한지 확인해 보셨습니까?
  • 인증 코드가 실행되지 않는 이유는 무엇입니까? 디버거에서 코드를 단계별로 실행하려고하면 어떻게됩니까?
관련 문제