很高兴看到托管和非托管程序集。我意识到这个列表会很长,但我打算对它进行增量搜索。12345678910111213141516171819"/>

关于 .net:确定加载的程序集

关于 .net:确定加载的程序集

Determine Loaded Assemblies

如何确定我的 .NET 桌面应用程序已加载的所有程序集?我想将它们放在"关于"框中,这样我就可以通过电话查询客户以确定他们的 PC 上的 XYZ 版本。

很高兴看到托管和非托管程序集。我意识到这个列表会很长,但我打算对它进行增量搜索。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Reflection;
using System.Windows.Forms;

public class MyAppDomain
{
  public static void Main(string[] args)
  {
    AppDomain ad = AppDomain.CurrentDomain;
    Assembly[] loadedAssemblies = ad.GetAssemblies();

    Console.WriteLine("Here are the assemblies loaded in this appdomain\
");
    foreach(Assembly a in loadedAssemblies)
    {
      Console.WriteLine(a.FullName);
    }
  }
}

PowerShell 版本:

1
[System.AppDomain]::CurrentDomain.GetAssemblies()

或者 System.Reflection.Assembly.GetLoadedModules().

请注意,AppDomain.GetAssemblies 只会迭代当前 AppDomain 中的程序集。一个应用程序可能有多个 AppDomain,因此它可能会或可能不会做你想做的事。


对于包括非托管在内的所有 DLL,您可以调用 EnumProcessModules 来获取模块句柄,然后对每个句柄使用 GetModuleFileName 来获取名称。

参见 http://pinvoke.net/default.aspx/psapi.EnumProcessModules 和 http://msdn.microsoft.com/en-us/library/ms683197(VS.85).aspx(pinvoke.net 没有有这个签名,但很容易弄清楚)。

对于 64 位,您需要使用 EnumProcessModulesEx


看起来 AppDomain.CurrentDomain.GetAssemblies(); 可以解决问题 :)


推荐阅读