是否有可能反映正在运行的.NET进程?

时间:2009-09-03 08:09:46

标签: .net reflector reflection.emit

我有一个运行时发出的动态类型的应用程序。为了检查生成的.NET代码,我们保存动态生成的程序集并使用Reflector。

我想知道是否有办法在相应的进程运行时反映它们的Reflector方式,而不必保存动态程序集?换句话说,在Reflector中有一种“附加到进程...”按钮。

感谢。

编辑:该功能的唯一存在理由是反思动态生成的程序集。

2 个答案:

答案 0 :(得分:2)

我知道您可能正在寻找动态装配体中的C#代码,而且这个问题很老了,但是...

您可以使用Visual Studio 立即窗口或使用 WinDbg 来获取正在运行的动态程序集的IL。 (如果您正在调试64位进程,则必须使用WinDbg,因为Visual Studio仍然是32位产品。)

  1. 附加到流程
    • WinDbg :如果另一个进程已作为调试器附加,则需要“无创”地完成。点击F6(或选择文件 - >附加到处理),如果VS已经附加,请选择“无创”选项。
    • Visual Studio :当您选择“开始调试”或按F5时,VS会自动执行此操作,但可以通过在调试菜单中选择“附加到进程”来手动完成。
  2. 使用!load SOS.dll!load SOS命令加载SOS.dll。
    • WinDbg :在非侵入模式下,WinDbg需要SOS.dll的完整路径。对于.NET 4,路径类似于C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll
  3. 中断执行并选择你的主题。
    您可以通过设置断点在任一调试器中自动执行此操作,或者通过弹出异常帮助程序在VS中执行此操作。
    • WinDbg :在非侵入模式下,您需要使用~命令和~n s命令手动选择线程。使用~列出所有线程并使用~n s命令进行切换。例如,使用~12 s切换到12号线。
  4. 获取堆栈跟踪以及指令指针。命令:!clrstack
  5. 抓住IP并找到指向的方法。命令:!ip2md [address]
    • 例如,如果要转储的方法的IP为0123456,则会发出命令!ip2md 0123456
  6. 转储方法的IL。命令:!dumpil [method descriptor]
    • 例如,如果IP2MD命令列出'0A1B2C3D as the address of the method descriptor, you would issue the command!dumpil 0A1B2C3D`。
  7. 这应该允许您进入动态装配,尽管在IL装配中。

答案 1 :(得分:-1)

Reflector(http://weblogs.asp.net/kdente/articles/438539.aspx)有一个正在运行的程序集加载项。但是,我怀疑它只是帮助检索运行程序集的路径,随后由Reflector从磁盘加载程序集。但是,它可能值得一试。此外,创建反射器加载项并不是那么困难,因此您可以扩展正在运行的程序集加载项方法,以自动将程序集保存到磁盘,以便它可以由Reflector加载(假设现有加载项)还没有这样做。)