Minhas DLLs são carregadas por um aplicativo de terceiros, que não podemos personalizar. Minhas montagens devem estar localizadas em sua própria pasta. Não posso colocá-los no GAC (meu aplicativo precisa ser implantado usando o XCOPY). Quando a DLL raiz tenta carregar o recurso ou o tipo de outra DLL (na mesma pasta), o carregamento falha (FileNotFound). É possível adicionar a pasta onde minhas DLLs estão localizadas ao caminho de pesquisa do assembly programaticamente (a partir da DLL raiz)? Não tenho permissão para alterar os arquivos de configuração do aplicativo.
.net
search
assemblies
path
isobretatel
fonte
fonte
if (!File.Exists(asmPath)) return searchInGAC(...);
Você pode adicionar um caminho de investigação ao arquivo .config do aplicativo, mas ele só funcionará se o caminho de investigação estiver contido no diretório base do aplicativo.
fonte
AssemblyResolve
solução tantas vezes, é bom ter outra opção (e mais fácil).Atualização para o Framework 4
Como o Framework 4 gera o evento AssemblyResolve também para recursos, na verdade, esse manipulador funciona melhor. É baseado no conceito de que as localizações estão nos subdiretórios de aplicativos (um para localização com o nome da cultura, por exemplo, C: \ MyApp \ it for Italian). Dentro, existem arquivos de recursos. O manipulador também funciona se a localização for região-país, ou seja, it-IT ou pt-BR. Nesse caso, o manipulador "pode ser chamado várias vezes: uma vez para cada cultura na cadeia de fallback" [do MSDN]. Isso significa que, se retornarmos nulos para o arquivo de recursos "it-IT", a estrutura acionará o evento solicitando "it".
Gancho de evento
Manipulador de eventos
fonte
AssemblyName
construtor para decodificar o nome da montagem em vez de confiar na análise da cadeia de montagem.A melhor explicação do próprio MS :
fonte
AssemblyResolve
é para CurrentDomain, não é válido para outro domínioAppDomain.CreateDomain
Para usuários de C ++ / CLI, aqui está a resposta do @Mattias S (que funciona para mim):
fonte
Eu usei a solução @Mattias S. Se você realmente deseja resolver dependências da mesma pasta - tente usar Solicitando local da montagem , como mostrado abaixo. args.RequestingAssembly deve ser verificado quanto à nulidade.
fonte
procure em AppDomain.AppendPrivatePath (descontinuado) ou AppDomainSetup.PrivateBinPath
fonte
AppDomain.AppendPrivatePath
A documentação de parece sugerir que ele deve suportar a expansão dinâmica doAppDomain
caminho de pesquisa, apenas que o recurso foi descontinuado. Se funcionar, é uma solução muito mais limpa do que a sobrecargaAssemblyResolve
.AppDomain.AppendPrivatePath
não faz nada no .NET Core e atualizações.PrivateBinPath
na estrutura completa .Eu vim aqui de outra pergunta (marcada como duplicada) sobre como adicionar a marca de análise ao arquivo App.Config.
Quero adicionar uma nota lateral a isso - o Visual Studio já gerou um arquivo App.config, no entanto, a adição da marca de análise à marca de tempo de execução pré-gerado não funcionou! você precisa de uma tag de tempo de execução separada com a tag de análise incluída. Em resumo, seu App.Config deve ficar assim:
Demorou algum tempo para descobrir, então estou postando aqui. Também créditos para o pacote PrettyBin NuGet . É um pacote que move as DLLs automaticamente. Eu gostei de uma abordagem mais manual, por isso não a usei.
Além disso - aqui está um script de pós-compilação que copia todos os arquivos .dll / .xml / .pdb para / Lib. Isso organiza a pasta / debug (ou / release), o que eu acho que as pessoas tentam alcançar.
fonte