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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top