Determine Loaded Assemblies

2019-04-24 14:32发布

问题:

How can I determine all of the assemblies that my .NET desktop application has loaded? I'd like to put them in the about box so I can query customers over the phone to determine what version of XYZ they have on their PC.

It would be nice to see both managed and unmanaged assemblies. I realize the list will get long but I plan to slap an incremental search on it.

回答1:

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\n");
    foreach(Assembly a in loadedAssemblies)
    {
      Console.WriteLine(a.FullName);
    }
  }
}


回答2:

Either that, or System.Reflection.Assembly.GetLoadedModules().

Note that AppDomain.GetAssemblies will only iterate assemblies in the current AppDomain. It's possible for an application to have more than one AppDomain, so that may or may not do what you want.



回答3:

PowerShell Version:

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


回答4:

Looks like AppDomain.CurrentDomain.GetAssemblies(); will do the trick :)



回答5:

For all DLLs including unmanaged, you could pinvoke EnumProcessModules to get the module handles and then use GetModuleFileName for each handle to get the name.

See http://pinvoke.net/default.aspx/psapi.EnumProcessModules and http://msdn.microsoft.com/en-us/library/ms683197(VS.85).aspx (pinvoke.net does not have the signature for this but it's easy to figure out).

For 64 bit you need to use EnumProcessModulesEx