Determinar montagens carregadas
-
09-06-2019 - |
Pergunta
Como posso determinar todos os assemblies que meu aplicativo de desktop .NET carregou?Gostaria de colocá-los na caixa sobre para poder consultar os clientes por telefone para determinar qual versão do XYZ eles têm em seus PCs.
Seria bom ver assemblies gerenciados e não gerenciados.Sei que a lista ficará longa, mas pretendo fazer uma pesquisa incremental nela.
Solução
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);
}
}
}
Outras dicas
Ou isso, ou System.Reflection.Assembly.GetLoadedModules().
Observe que AppDomain.GetAssemblies apenas iterará assemblies no atual AppDomain.É possível que um aplicativo tenha mais de um AppDomain, então ele pode ou não fazer o que você deseja.
Versão do PowerShell:
[System.AppDomain]::CurrentDomain.GetAssemblies()
Parece AppDomain.CurrentDomain.GetAssemblies();
vai resolver o problema :)
Para todas as DLLs, incluindo as não gerenciadas, você pode invocar EnumProcessModules para obter os identificadores do módulo e, em seguida, usar GetModuleFileName para cada identificador para obter o nome.
Ver http://pinvoke.net/default.aspx/psapi.EnumProcessModules e http://msdn.microsoft.com/en-us/library/ms683197(VS.85).aspx (pinvoke.net não tem assinatura para isso, mas é fácil de descobrir).
Para 64 bits você precisa usar EnumProcessModulesEx