Pergunta

Como posso saber pelo nome do assembly, ou pela classe do assembly (ou outros semelhantes), se um assembly faz parte do .LÍQUIDO estrutura (ou seja, System.windows.Forms)?

Até agora considerei as propriedades PublicKeyToken e CodeBase, mas nem sempre são as mesmas para toda a estrutura.

O motivo pelo qual desejo essas informações é obter uma lista de assemblies que meu arquivo EXE está usando e que precisam estar em máquinas clientes, para que eu possa empacotar os arquivos corretos em um arquivo de configuração sem usar o sistema de configuração do Visual Studio.O problema é que não quero escolher nenhum assemblie do .NET Framework e quero que seja um processo automático que seja fácil de implementar sempre que uma atualização importante for concluída.

A solução definitiva seria que existisse uma propriedade IsFramework...:)

Foi útil?

Solução

Suspeito que o método mais confiável e mais geral será o PublicKeyToken.Sim, há mais de um, mas será uma lista finita e que não muda com muita frequência.

Por falar nisso, você poderia apenas ter uma lista branca de nomes de assembly - essa lista também será finita e estática entre as versões do framework.

Outras dicas

Para fazer isso, estou usando o nome do produto incorporado na montagem por meio do AssemblyProductAttribute.

var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");

Estou usando essa técnica para agrupar montagens por produto na tela Sobre do aplicativo e parece funcionar muito bem para mim.

Eu tive que lidar exatamente com o mesmo problema.Infelizmente, todas as respostas dadas até agora são insuficiente para determinar com segurança se um assembly faz parte do .NET Framework.

A Microsoft coloca uma classe chamada FXAssembly no namespace global de cada assembly da estrutura com uma string const indicando a versão:

.class private abstract auto ansi sealed beforefieldinit FXAssembly
    extends [mscorlib]System.Object
{
    .field assembly static literal string Version = string('2.0.0.0')

}

Use este "marcador" para verificar se uma montagem é uma montagem de estrutura.Verificar a chave pública também não fará mal.

Não, não começa com "Sistema".Você pode verificar "WindowsBase", que é uma montagem de estrutura.

Você também não pode verificar o PublicKeyToken, porque existem outros assemblies da Microsoft assinados com as chaves "padrão", mas eles não fazem parte do .NET Framework (assemblies do Visual Studio).

A melhor maneira de fazer isso é obter uma coleção de estruturas .NET instaladas e verificar se o assembly de destino faz parte de seu RedistList (RedistList\FrameworkList.xml).

FrameworkList.xml pode ser encontrado em:

  • .NET 2.0:C:\Windows\Microsoft.NET\Framework64\v2.0.50727 edistList
  • .NET 3.x:C:\Arquivos de Programas (x86)\Assemblies de Referência\Microsoft\Framework\vNúmero da versão edistList
  • .NET 4.x:C:\Arquivos de Programas (x86)\Assemblies de Referência\Microsoft\Framework.NETFramework\vNúmero da versão edistList
  • Núcleo .NET:C:\Arquivos de Programas (x86)\Assemblies de Referência\Microsoft\Framework.NETCore\vNúmero da versão edistList

Se você sabe que nenhuma de suas DLLs estará no GAC, você poderá verificar se cada assembly está no GAC ou não.Se for, não copie.Se não estiver, copie-o.Existe uma propriedade na classe Assembly chamada GlobalAssemblyCache.Obviamente, isso funcionaria melhor em algumas situações do que em outras.

Ao instalar o Visual Studio, você obtém os assemblies de referência em várias subpastas do formulário C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion} - o mais interessante poderia ser o RedistList\FrameworkList.xml arquivo que contém uma lista de todos os nomes de assembly que foram enviados com a versão da estrutura fornecida.

Por exemplo. C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml parece conter uma lista de todos os assemblies do Framework do .NET 4.0.

Você poderia facilmente usar esses arquivos para estabelecer listas brancas estáticas de assemblies.

Você poderia usar a reflexão para observar o editor da montagem e coordenar isso com o caminho da montagem.Se você encontrar um assembly cujo editor é a Microsoft e que existe em algum lugar abaixo C:\Windows\Microsoft.NET\Framework é uma aposta segura que faz parte do tempo de execução.

Pensando bem, o editor pode nem ser necessário.Qualquer coisa nesse caminho deve fazer parte do tempo de execução (exceto um aplicativo com comportamento inadequado que está se mexendo onde não deveria).

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