Pergunta

Como posso dizer ao meu aplicativo .NET onde procurar um conjunto específico que ele precisa (exceto o GAC ou a pasta de onde o aplicativo é executado)? Por exemplo, eu gostaria de colocar uma montagem na pasta temporária do usuário e pedir ao meu aplicativo saber que o conjunto referenciado está na pasta Temp.

Obrigado

Foi útil?

Solução

você pode usar o AppDomain.ASSEMBLYRESOLVE evento para adicionar resolvedores de montagem personalizados. Isso permite que você aponte para outros diretórios ou mesmo bancos de dados para obter montagens conforme necessário.

Eu até usei código semelhante para baixar assemblies de um banco de dados e armazenar no ISolatedStorage. O nome do arquivo como um hash do nome completo da montagem. Em seguida, o banco de dados precisaria apenas baixar na primeira vez que você resolve e todas as resoluções futuras serão servidas pelo sistema de arquivos. O melhor sobre o evento AssemblyResolve é que você pode usá -lo tipo.gettype () e os serializadores incorporados.

static string lookupPath = @"c:\otherbin";

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += 
        new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

static Assembly CurrentDomain_AssemblyResolve(object sender, 
                                              ResolveEventArgs args)
{
    var assemblyname = new AssemblyName(args.Name).Name;
    var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll");
    var assembly = Assembly.LoadFrom(assemblyFileName);
    return assembly;
}

Outras dicas

Veja esta discussão para algumas das questões envolvidas:

http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading

Basicamente, você não pode alterar a base de um aplicativo depois de ser criada. Você deve especificá -lo como parte da configuração antes de criar um novo, que não o ajudará no aplicativo padrão.

Se a montagem que você deseja carregar estiver em um diretório abaixo da base do aplicativo atual, você poderá adicionar seu caminho relativo usando o AppendPrivatePath (RelityPath) e, em seguida, use o Assembly.Load - o tempo de execução investigará os subdiretos para você. Esta é a melhor maneira/mais fácil de lidar com isso.

System.Reflection.Assembly.LoadFrom(myFile);

http://msdn.microsoft.com/en-us/library/1009fa28.aspx

Outra alternativa é lidar com os eventos de resolução de montagem, como nesta pergunta do StackOverflow: Como adicionar pasta ao caminho da pesquisa de montagem no tempo de execução no .net?

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