【问题标题】:c# application: how to view the loaded assembliesc#应用程序:如何查看加载的程序集
【发布时间】:2009-12-11 05:14:07
【问题描述】:

depends.exe 工具可以遍历可执行文件所依赖的所有 dll,但如果 DLL 是由 Assembly 类在运行时动态加载的,我如何查看已经加载的 DLL(程序集)?

【问题讨论】:

标签: c# .net


【解决方案1】:

作为快照:

AppDomain.CurrentDomain.GetAssemblies()

当它们发生时:

AppDomain.CurrentDomain.AssemblyLoad

类似:

static void Main()
{
    AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoad;
    LogCurrent("before");
    AnotherMethod();
    LogCurrent("after");
}
static void AnotherMethod()
{
    // to force stuff to happen
    new System.Data.SqlClient.SqlCommand().Dispose(); 
}
static void LogCurrent(string caption)
{
    foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        Console.WriteLine(caption + ": " + asm.FullName);
    }
}

static void AssemblyLoad(object sender, AssemblyLoadEventArgs args)
{
    Console.WriteLine("Loaded: " + args.LoadedAssembly.FullName);
}

【讨论】:

  • 谢谢。但我想要的是一个像depends.exe这样的外部工具来查看加载的程序集。
  • 如果它在运行时加载 dll,那么它可能会从任何地方获取字符串。监控它的唯一方法是 at 运行时。你可以使用windbg/sos,并附加到进程中?
  • WinDbg 一定是最方便的方式。您可以简单地使用“lm”列出所有模块,包括原生模块和托管模块。
  • 应该AssemblyLoad(object sender, AssemblyLoadEventArgs args) 返回Assembly 并且void
【解决方案2】:

假设您没有搞乱 AppDomains:

AppDomain.CurrentDomain.GetAssemblies();

【讨论】:

    【解决方案3】:

    你说你在寻找外部工具?尝试带有 SOS 调试扩展的 WinDbg; http://msdn.microsoft.com/en-us/library/bb190764.aspx

    还有其他可能更易于使用的工具提供相同级别的详细信息。我认为 JetBrains 的人有一个(Resharper)

    【讨论】:

      【解决方案4】:

      fuslogw 可以帮助解决这个问题,它有一个监控所有程序集绑定的选项 http://msdn.microsoft.com/en-us/library/e74a18c4(VS.71).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2013-11-30
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多