2

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

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

谢谢。

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

4

2 回答 2

2

我知道您可能正在寻找来自动态程序集的 C# 代码,并且这个问题已经很老了,但是......

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

  1. 附加到进程
    • WinDbg:如果另一个进程已作为调试器附加,则需要“非侵入式”完成。点击 F6(或选择文件 -> 附加到进程),如果 VS 已附加,则选择“非侵入性”选项。
    • Visual Studio:当您选择“开始调试”或按 F5 时,VS 会自动执行此操作,但可以通过在调试菜单中选择“附加到进程”手动完成。
  2. !load SOS.dll使用命令或简单地加载 SOS.dll !load SOS
    • 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”。

这应该允许您查看动态程序集,尽管是在 IL 程序集中。

于 2011-07-08T00:14:48.647 回答
-1

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

于 2009-09-03T18:20:03.237 回答