2012-04-03 11 views
5

Używam aplikacji WCF CoreApplication, której projekt VS ma odniesienie do AncillaryProject. CoreApplication używa klasy Provider z AncillaryProject; nie jest to jednak nigdy jawnie przywoływane - jest wywoływane za pomocą Reflection.Nie znaleziono zestawu odniesienia - jak uzyskać wszystkie biblioteki DLL uwzględnione w rozwiązaniu

Moim problemem jest to, że czasamiCoreApplication nie znajdzie Provider ponieważ AncillaryProject nie pojawią się w zaproszeniu do GetAssemblies(). Czasami działa dobrze, ale czasami (domyślam się, że może to być po JIT) nie działa.

Oto mój oryginalny kod:

var providers = from d in AppDomain.CurrentDomain.GetAssemblies() 
       from c in d.GetTypes() 
       where typeof(BaseProvider).IsAssignableFrom(c) 
       select c; 

Po obejrzeniu this question, próbowałem za pomocą GetReferencedAssemblies():

var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) 
{ 
    allAssemblies = allAssemblies.Union(
          a.GetReferencedAssemblies() 
          .Select(b => System.Reflection.Assembly.Load(b))); 
} 
var providers = from d in allAssemblies 
       from c in d.GetTypes() 
       where typeof(BaseProvider).IsAssignableFrom(c) 
       select c; 

Zdaję sobie sprawę, że kwestia ja odwoływać rozwiązuje ten problem poprzez dynamicznie ładuje wszystkie pliki dll w katalog bin, ale to nie brzmi szczególnie dobrze dla mnie. Czy istnieje lepszy sposób na zrobienie tego, czy też .NET po prostu nie ładuje w ogóle innych Złożenia? Jak to działa pod maską i czy jest coś, co mogę z tym zrobić?

+1

To nie będzie całkowicie odpowiedzieć na to pytanie, ale istnieją pewne istotne informacje w moją odpowiedź na to pytanie: http://stackoverflow.com/questions/9947882/ get-assemblies-without-tworzenie ich-egzemplarzy/9948404 # comment12730056_9948404 Poza zauważeniem, że zespoły "referencyjne" w VisualStudio nie mają większego znaczenia w czasie wykonywania, odpowiedź poniżej na temat używania Fusion Logger jest również dobrą pomocą. Powinieneś być w stanie skopiować AncillaryProject.dll wszędzie tam, gdzie Fusion szuka złożeń, ale może dostarczyć odpowiedzi na pytanie, gdzie szuka. – CodingWithSpike

+0

Ahh - to daje mi dokładnie te informacje, które muszę znać. – eouw0o83hf

+0

Obserwacja dla każdego, kto znajdzie to pytanie: w ciągu kolejnych lat od zadawania tego, zdałem sobie sprawę, że podchodzę do tego w zupełnie niewłaściwy sposób. Czasami bycie mniej magicznym i wyraźne wymienianie "rodzaju", który chcesz, jest o wiele lepsze. To jedna z tych sytuacji. – eouw0o83hf

Odpowiedz

9

Zgodnie z dokumentacją Microsoft AppDomain.CurrentDomain.GetAssemblies() pobiera zespoły, które zostały załadowane do kontekstu wykonania tej domeny aplikacji. About AppDomain.CurrentDomain.GetAssemblies()

Wygląda na to, że musisz zmienić strategię ładowania wymaganych zestawów, używając aplikacji do wyszukiwania bibliotek dll w folderze aplikacji.

znalazłem dyskusję na podobny problem here

+0

Tak, to doskonale opisuje. Dzięki. – eouw0o83hf

3

Należy pobrać .NET Development SDK i uruchomienie FuslogVw.exe (log widza fuzji). Będzie raportować o aplikacji CLR próbującej rozwiązać zależności .NET. Pokaże Ci, że tak wygląda i jak ocenia kandydatów znajdujących się w tych miejscach.

Powiązane problemy