Assembly.LoadFrom - usando sobrecarga Evidência para verificar a assinatura de nome forte

StackOverflow https://stackoverflow.com/questions/809934

  •  03-07-2019
  •  | 
  •  

Pergunta

É possível usar a sobrecarga Assembly.LoadFrom com o parâmetro Evidence para assegurar o conjunto é fortemente nomeado? Eu quero ser capaz de especificar o nome do assembly, a cultura, a versão eo token de chave pública. Se qualquer uma dessas informações não coincide com a montagem deve deixar de carga.

Foi útil?

Solução 3

Eu encontrei outra maneira de fazer isso.

var assemblyName = new AssemblyName(<fully qualified type name>);
assemblyName.CodeBase = <path to assembly>

Assembly.Load(assemblyName);

Outras dicas

Você pode obter a chave pública de uma Assembléia depois de carregá-lo - se ele carrega com sucesso e tem uma chave pública, então é de nome forte:

Assembly assembly = Assembly.LoadFrom (...);
byte[] pk = assembly.GetName().GetPublicKey();

Melhor ainda, verificar chave e versão pública informações da montagem antes carregá-lo:

AssemblyName an = AssemblyName.GetAssemblyName ("myfile.exe");
byte[] publicKey = an.GetPublicKey();
CultureInfo culture = an.CultureInfo;
Version version = an.Version;

Se GetPublicKey () retorna um valor não nulo, e, em seguida, as cargas de montagem com êxito, ele tem um nome forte válido.

Eu tenho uma maneira de quebrar a verificação de nome forte para remendar System.Windows.Forms.dll. Se eu estou usando-o, não há muito que você pode fazer sobre ele. Meu truque requer confiança total.

O que fiz foi corrigir o dll, implantar a dll remendado, ngen-lo e corrigir o carregador para pegar a imagem ngen remendado em vez do original. O que eu poderia ter feito era espancar o estoque ngened dll. (I realmente testado este caminho e decidiu potencialmente quebra de alguém software foi uma má escolha.)

Eu não estou dizendo que isso é uma boa idéia para fazer. Estou dizendo que, dependendo de verificação de assinaturas a partir Assembly.Load é uma má idéia.

Tente o System.ReflectionAssemblyNameFlags enumeração:

bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top