如何确定我的 .NET 桌面应用程序已加载的所有程序集?我想把它们放在关于框中,这样我就可以通过电话查询客户以确定他们在他们的 PC 上使用的 XYZ 版本。
很高兴看到托管和非托管程序集。我意识到这个列表会很长,但我计划对其进行增量搜索。
如何确定我的 .NET 桌面应用程序已加载的所有程序集?我想把它们放在关于框中,这样我就可以通过电话查询客户以确定他们在他们的 PC 上使用的 XYZ 版本。
很高兴看到托管和非托管程序集。我意识到这个列表会很长,但我计划对其进行增量搜索。
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);
}
}
}
PowerShell 版本:
[System.AppDomain]::CurrentDomain.GetAssemblies()
要么,要么 System.Reflection.Assembly.GetLoadedModules()。
请注意,AppDomain.GetAssemblies 只会迭代当前AppDomain 中的程序集。一个应用程序可能有多个 AppDomain,因此它可能会或可能不会做你想要的。
看起来AppDomain.CurrentDomain.GetAssemblies();
会做的伎俩:)
对于包括非托管在内的所有 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