我非常确信.NET运行时将程序集加载为普通的dll。但我发现,当我将"本机"调试器连接到托管进程时,我看不到加载的程序集。
同样的事情也适用于Sysinternals工具-listdll。它只看到加载的dll,而看不到程序集。
我想知道CLR是如何从程序集中加载和执行代码的?我有一个类似于listdll的工具来遍历所有托管进程并列出所有加载的程序集吗?
首先,程序集不是DLL。DLL是一个物理文件,而程序集是.NET框架的一个逻辑概念。单个DLL可能包含多个程序集。
有很多方法可以列出进程加载的程序集,以下是其中的一些:
- 使用SysInternal Process Explorer,双击进程并切换到.NET Assemblys选项卡
- 使用像WinDbg/CDB/NTSD这样的调试器,连接到目标进程,通过输入命令
.loadby sos clr
加载SOS扩展,然后输入!DumpDomain
命令列出加载到每个AppDomain中的程序集 - 使用MDbg调试器,连接到目标进程,然后输入命令
list assemblies