Comportamento estranho quando a mistura de carga de montagens usando assembly.LoadFrom e Assembly.Load

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Comportamento estranho quando a mistura de carga de montagens usando assembly.LoadFrom e Assembly.Load

Eu encontrei um comportamento estranho quando os conjuntos de carregamento com Assembly.LoadFrom e mais tarde com Assembly.Load.
Eu estou carregando um Assembly.LoadFrom montagem usando, onde o conjunto é localizado em uma pasta que não seja a pasta de execução.

Mais tarde, no meu código de teste quando eu tento carregar uma vez esta montagem com Assembly.Load, a carga falha com um System.IO.FileNotFoundException ( “Não foi possível carregar arquivo ou assembly ...”), apesar do fato de que o conjunto já está carregado. A carga não tanto com o nome forte e o nome não-forte (a razão original de carga, uma vez mais esta montagem é um uso de um BinaryFormatter).

No entanto, no caso do assembly está localizado na execução pasta a carga depois sucede em ambos os casos, com o nome forte e o nome não-forte. Neste caso, você pode ver que dois conjuntos idênticos são carregados a partir de dois locais diferentes.

Um exemplo de código simples que recria este problema -

Assembleia assembly1 = Assembly.LoadFrom (@ "C: \ A.dll");

// Carregando com um forte nome falhar Assembléia assembleia2 = Assembly.Load (@ "a, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 14986c3f172d1c2c ");

// Também carregamento com um não-forte falhar Assembléia assembly3 = Assembly.Load (@ "a");

  1. Qualquer explicação por que o CLR ignora o já carregado montagem?
  2. Qualquer idéia de como posso aliviar este problema?

Graças.

Foi útil?

Solução

Isso não é estranho. De acordo com a documentação, carregamento com carga e LoadFrom vai colocar os conjuntos em diferentes contextos. Este poder ajuda.

  1. Qualquer explicação por que o CLR ignora o já carregado montagem?

Porque eles estão em um contexto diferente.

  1. Qualquer idéia de como posso aliviar este problema?

Load do mesmo contexto, ou ajuda a CLR encontrar a montagem, talvez anexando um manipulador para AppDomain.AssemblyResolve.

Alternativa

Se o local que são conjuntos de carregamento de uma subpasta AppDomain.BaseDirectory você pode simplesmente adicionar uma entrada para o seu App.config:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

http://msdn.microsoft.com/en-us/library /823z9h8w.aspx

Outras dicas

@Kent Boogart: Essa parece ser a explicação correta. Para uma explicação completa, Suzanne Cook tem este post, que elabora um pouco mais do que o original que você postou: http://blogs.msdn.com/suzcook/archive/2003 /05/29/57143.aspx

A seguir é o código alavancar AppDomain.AssemblyResolve -

 // register to listen to all assembly resolving attempts:
 AppDomain currentDomain = AppDomain.CurrentDomain;
 currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);


 // Check whether the desired assembly is already loaded
 private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
    Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
    foreach (Assembly assembly in assemblies) {
       AssemblyName assemblyName = assembly.GetName();
       string desiredAssmebly = args.Name;
       if (assemblyName.FullName == desiredAssmebly) {
           return assembly;
       }
    }

    // Failed to find the desired assembly
    return null;
 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top