Assembly.LoadFrom - usando sobrecarga Evidência para verificar a assinatura de nome forte
-
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.
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);