Como alterar o caminho de carregamento de referências em .NET?
-
03-07-2019 - |
Pergunta
Eu quero uma configuração como esta:
+- /ApplicationFolder
-- App.exe
-- Core.dll
-- AnotherShared.dll
+- /PluginsFolder
-- plugin1.dll
-- plugin2.dll
Mas porque as referências plugin1.dll para Core.dll e Shared.dll quando eu compilar a aplicação deixa cair uma cópia de "Copy.dll" e "Shared.dll" para plugins pasta como bem e se eu remover a eles que doesn 't trabalho mais.
Como posso resolver este problema?
Solução
Quando você cria um AppDomain você pode definir um caminho para os conjuntos de carregamento. Set AppDomainSetup.PrivateBinPath
e passar para o domínio AppDomain.Create.
Usando um AppDomain é uma boa idéia para plugins (permite diferentes CAS e descarga).
Para evitar VS / msbuild copiar assemblies referenciados para o diretório de saída, altere "Copy Local" para falsa nas propriedades da referência.
Outras dicas
Meu MEF é configurado para esse plugin projetos compilar a sua própria pasta (como o é o padrão), então eu uso um comando pós-compilação para copiar arquivos específicos para a pasta extensões de saída.
A outra maneira é ter a compilação de projeto diretamente para a pasta de saída e, como o outro cartaz disse, abra o painel "Propriedades" para cada referência relevante em seu projeto de plug-in e set "Copy Local" para falsa.
Você pode tentar este: Como posso definir PrivateBinPath em MEF ? a>
ou você pode tentar manipular o evento AppDomain.AssemblyResolve que é gerado a qualquer hora .net não pode localizar uma montagem. lá você pode implementar lógica personalizada para localizar e montagens de carga de qualquer lugar.
os AssemblyResolve EventHandler Jsut Retorna um conjunto que hoje vem sendo procurados ou nulo, para que você possa retornar o Core.dll já carregado a partir disponíveis a partir dos AppDomain.GetAssemblies () método.
No entanto, no seu caso, deve ser ok para simplesmente não incluem Code.dll com plugin1.dll, .net já deve perceber que Core.dll é carregado e uso essa instância