2008-08-22 10 views
21

Moja aplikacja dynamicznie ładuje złożenia w środowisku wykonawczym z określonych podfolderów. Te zespoły są kompilowane z zależnościami do innych zespołów. Środowisko wykonawcze próbuje je załadować z katalogu aplikacji. Ale chcę umieścić je w katalogu modułów.Ładowanie złożeń i ich zależności

Czy istnieje sposób informowania środowiska wykonawczego, że biblioteki DLL są w osobnym podfolderze?

Odpowiedz

18

Jeden miły podejście Użyłem ostatnio jest dodanie obsługi zdarzeń dla zdarzenia AppDomain za AssemblyResolve.

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); 

Następnie w metodzie obsługi zdarzenia można załadować zestawu, który próbowano rozwiązać za pomocą jednego z Assembly.Load, nadpisuje Assembly.LoadFrom i odesłać go z tej metody.

EDIT:

Na podstawie dodatkowych informacji myślę stosując technikę powyżej, a konkretnie rozwiązanie odniesień do zespołu siebie jest jedynym realnym podejściem, które będzie działać bez restrukturyzacji swoją aplikację. To co daje to to, że lokalizacja każdego zespołu, którego CLR nie potrafi rozwiązać, może zostać ustalona i załadowana przez twój kod w czasie wykonywania ... Używałem tego w podobnych sytuacjach zarówno dla architektur wtykowych, jak i dla integralności referencyjnej zespołu. narzędzie do skanowania.

+3

Dobrym przykładem tej techniki jest aplikacja LINQPad. Jest dostarczany jako pojedynczy exe, więc wszystkie biblioteki są włączone jako zasoby osadzone. Zobacz http://www.albahari.com/nutshell/ch16.aspx dla kodu i http://www.linqpad.net/HowLINQPadWorks.aspx dla wglądu. – Pat

4

Możesz użyć elementu <probing> w pliku manifestu, aby środowisko wykonawcze szukało w różnych katalogach plików zespołu.

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

np .:

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

Możesz użyć elementu <codeBase> znalezionego w pliku konfiguracyjnym aplikacji. Więcej informacji na temat "Locating the Assembly through Codebases or Probing".

Załadowany zespół nie ma pliku konfiguracyjnego aplikacji .

Jeśli znasz konkretne foldery w czasie wykonywania, możesz użyć Assembly.LoadFrom.

+0

Pierwszy link daje "Temat już nie istnieje". Podaje jednak, że .Net 4.0: [https://msdn.microsoft.com/en-us/library/15hyw9x3%28v=vs.100%29.aspx](https://msdn.microsoft.com/en -us/library/15hyw9x3% 28v = vs.100% 29.aspx) – AnorZaken

Powiązane problemy