definição de exceção até manipulador para AppDomain.AssemblyResolve
Pergunta
Criar um novo appdomain, configuração o manipulador AssemblyResolve e você sempre terá uma exceção dizendo 'montagem [atual execução de montagem] não encontrado'
que dá? código está abaixo
string _fileName = @"c:\temp\abc123.dll";
AppDomain sandBox = AppDomain.CreateDomain("sandbox");
sandBox.AssemblyResolve += new ResolveEventHandler(sandBox_AssemblyResolve);
// the line generates the exception !
System.Reflection.Assembly asm = sandBox.Load(System.Reflection.AssemblyName
.GetAssemblyName(fileName).FullName);
foreach (System.Reflection.AssemblyName ar in asm.GetReferencedAssemblies())
dbgWrite("Ref: " + ar.FullName );
System.Reflection.Assembly sandBox_AssemblyResolve
(object sender, ResolveEventArgs e)
{
System.Reflection.Assembly asm =
System.Reflection.Assembly.LoadFrom(_fileName);
return asm;
}
exceção é:
System.IO.FileNotFoundException: não foi possível carregar arquivo ou assembly 'AppAdmin, versão = 1.0.0.0, Culture = neutral, PublicKeyToken = null' ou uma de suas dependências. O sistema não pode encontrar o arquivo especificado. O nome do arquivo: 'AppAdmin, versão = 1.0.0.0, Culture = neutral, PublicKeyToken = null' [snip]
Solução
O seu resolvedor não pode fogo em seu novo AppDomain, tente defini-lo sobre a AppDomain.CurrentAppDomain vez.
AppDomain.CurrentDomain.AssemblyResolve + = novo ResolveEventHandler (sandBox_AssemblyResolve);
No método sandBox_AssemblyResolve você pode carregar o conjunto para cima de qualquer diretórios que quiser, este é o lugar onde a carga de um byte [] podem entrar em jogo.
Como para o carregamento de uma montagem usando byte [] este arquivo corrige problemas de bloqueio, não vai consertar o que aflige você eu não acho que ver aqui
Outras dicas
Você está tentando carregar os conjuntos que não estão sob local de base do AppDomain. Eu nunca tive o trabalho evento AssemblyResolve para mim, também.
Eu sugiro carregar o out-of-base de montagem em um array de bytes (System.IO.File.ReadAllBytes) e, em seguida, entregar essa matriz para o seu recém-criado AppDomain para carregar .