views:

405

answers:

4

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.

A: 

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

Nick
+5  A: 
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);
    }
  }
}
Greg Hurlman
+2  A: 

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.

DannySmurf
A: 

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

dpp