如何在MSIL代码中写入文件

时间:2010-05-27 08:37:33

标签: .net cil

我有一个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 个答案:

答案 0 :(得分:2)

结帐Mono.Cecil。它用于将程序集作为文件加载,与其内容混合,并保存结果。具体来说,this example会将调试跟踪添加到现有程序集的方法中。

答案 1 :(得分:1)

一些想法:

  • 如果您确实将IL添加到方法的最后,那么它将全部在ret指令(或其他无法到达的位置)之后,因此不会发生任何事情(并且IL可能不会有效的)。您是否尝试在装配体上运行peverify以确保其有效?
  • 是否有任何理由可能无法运行身份验证代码?如果您尝试在调试器中单步执行代码会发生什么?