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

是否可以反映正在运行的.NET进程?,.net,reflector,reflection.emit,.net,Reflector,Reflection.emit,我有一个在运行时发出动态类型的应用程序。为了检查生成的.NET代码,我们保存动态生成的程序集并使用Reflector 我想知道是否有一种方法可以在各个进程运行时以反射方式反映它们,而不必保存动态程序集?换句话说,在反射器中有一种“连接到进程…”按钮 谢谢 编辑:该功能的唯一理由是反映动态生成的程序集。Reflector()有一个正在运行的程序集加载项。然而,我怀疑它只是帮助检索运行程序集的路径,程序集随后由Reflector从磁盘加载。然而,这可能值得一试。另外,创建reflector外接程序并

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

我想知道是否有一种方法可以在各个进程运行时以反射方式反映它们,而不必保存动态程序集?换句话说,在反射器中有一种“连接到进程…”按钮

谢谢


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

Reflector()有一个正在运行的程序集加载项。然而,我怀疑它只是帮助检索运行程序集的路径,程序集随后由Reflector从磁盘加载。然而,这可能值得一试。另外,创建reflector外接程序并不困难,因此您可以扩展正在运行的程序集外接程序方法,以自动将程序集保存到磁盘,以便reflector可以加载它(假设现有的外接程序还没有这样做)

我知道您可能正在寻找从动态程序集中产生的C#代码,但是这个问题已经很老了

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

  • 附加到进程
    • WinDbg:如果另一个进程已作为调试器连接,则需要“非侵入性”执行此操作。点击F6(或选择文件->附加到进程),如果VS已附加,则选择“非侵入性”选项
    • VisualStudio:VS会在您选择“开始调试”或按F5时自动执行此操作,但可以通过在“调试”菜单中选择“附加到进程”手动执行此操作
  • 使用命令
    加载SOS.dll!加载SOS.dll
    或干脆
    !加载SOS
    • WinDbg:在无创模式下,WinDbg需要SOS.dll的完整路径。对于.NET 4,路径类似于
      C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll
  • 中断执行并选择线程。
    您可以通过设置断点在调试器中自动执行此操作,也可以通过弹出异常帮助器在VS中自动执行此操作。
    • WinDbg:在非侵入模式下,您需要使用
      ~
      命令和
      ~n s
      命令手动选择线程。使用
      ~
      列出所有线程,并使用
      ~ns
      命令切换。例如,使用
      ~12 s
      切换到线程编号12
  • 获取堆栈跟踪以及指令指针。命令:
    !clrstack
  • 获取IP并找到指向的方法。命令:
    !ip2md[地址]
    • 例如,如果要转储的方法的IP为
      0123456
      ,则会发出命令
      !ip2md 0123456
  • 转储方法的IL。命令:
    !dumpil[方法描述符]
    • 例如,如果IP2MD命令将“0A1B2C3D
      列为方法描述符的地址,则您将发出该命令
      !dumpil 0A1B2C3D`

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

    不幸的是,它没有显示动态程序集。。。我将重新措辞问题以强调这一点。+1了解WinDbg的详细说明。我更多的是在Reflector.NET中寻找一种方法