Как записать в файл в коде MSIL - PullRequest
3 голосов
/ 27 мая 2010

У меня есть веб-страница aspx, в которой используется сборочный рудник (который выполняет пользовательскую аутентификацию). Я хотел бы изменить код MSIL (просто с помощью инструментов ILDASM / ILASM) моей сборки, чтобы записать что-то в файл.

Я попытался добавить это в конце метода аутентификации моей сборки:

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 не выдает никаких исключений во время выполнения, но файл не создается и не изменяется! (

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Выезд Mono.Cecil . Он предназначен для загрузки сборок в виде файлов, отслеживания их содержимого и сохранения результатов. В частности этот пример добавляет трассировку отладки к методам существующей сборки.

1 голос
/ 18 января 2011

Несколько мыслей:

  • если вы буквально добавили этот IL в самый конец метода, то все это будет после инструкции ret (или другого недоступного места), поэтому ничего не произойдет (и IL, вероятно, также не будет действительным ). Вы пытались запустить peverify на своей сборке, чтобы убедиться, что она действительна?
  • есть ли причина, по которой код аутентификации не может быть запущен? Что произойдет, если вы попытаетесь пошагово выполнить код в отладчике?
...