2012-04-23 11 views
13

Mam następującą metodę, która powinna pobrać listę załadowanych lokalnych (w folderze bin) zespoły:Nie wszystkie zespoły są ładowane do AppDomain z katalogu bin

static IEnumerable<Assembly> GetLocalAssemblies() 
    { 
     Assembly callingAssembly = Assembly.GetCallingAssembly(); 
     string path = new Uri(Path.GetDirectoryName(callingAssembly.CodeBase)).AbsolutePath; 

     var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
     return assemblies.Where(x => !x.IsDynamic && new Uri(x.CodeBase).AbsolutePath.Contains(path)).ToList(); 
    } 

ale lista zespołów brakuje kilka zgromadzeń, których potrzebuję. Zespoły, których potrzebuję, są zarządzane (C# .net 4), są przywoływane w projekcie i znajdują się w folderze bin.

Dlaczego pliki binarne są obecne w folderze bin NIE zsuniętym do AppDomain po uruchomieniu aplikacji?

+0

z ciekawości, jaka jest wartość ścieżki ciągu? –

+0

Jest to ścieżka do folderu bin dla projektu. –

Odpowiedz

24

Adil ma, ale w sposób bardziej szczegółowy:

.NET CLR używa kompilacji Just-In-Time. Między innymi oznacza to, że ładuje złożenia przy pierwszym użyciu. Tak więc, pomimo zestawów, do których odwołuje się zespół w użyciu, jeśli referencje nie były jeszcze potrzebne przez CLR do wykonania programu, nie są one ładowane, a więc nie pojawią się na liście zespołów w bieżącej domenie AppDomain.

Inną rzeczą, która może, ale nie musi dotyczyć, jest to, że jeśli masz tę samą wersję zespołu w GAC, CLR używa preferencji GAC względem lokalnych zespołów, O ile ścieżka do tych zespołów nie jest określona w środowisku DEVPATH zmienna. Jeśli tak jest, a CLR używa kopii GAC dowolnego z "brakujących" zespołów, będą one miały różne wartości CodeBase i nie pojawią się w wynikach zapytania Linq.

Jeszcze jedno: warto rozważyć użycie właściwości Lokalizacja zamiast właściwości CodeBase. Właściwość Location zawiera bezwzględną ścieżkę do zestawu, który został załadowany w środowisku wykonawczym. Właściwość CodeBase jest nieco inna i może nie być taka sama dla wszystkich zespołów w pełnej kompilacji projektu.

+0

+1 dla właściwości lokalizacji. – Turbot

+1

+1 "jeśli referencje nie były potrzebne w CLR, nie pojawią się na liście zestawów w bieżącym AppDomain" <--- Ugh. To był główny problem błędu, który mnie zabija. – jwatts1980

4

The CurrentDomain.GetAssemblies() zwraca tylko załadowane złożenia, nie wszystkie złoŜenia, które są dostępne w folderze wykonawczym.

To właśnie mówi Microsoft o "metodzie GetAssemblies, aby uzyskać listę wszystkich złożeń, które zostały załadowane do domeny aplikacji." click here

3

Spróbuj zainicjować dowolną klasę w tych brakujących złożeniach, a następnie ponownie uruchom kod. Zespoły są ładowane tylko wtedy, gdy są potrzebne tylko przy pierwszym wywołaniu wszystkiego, co dotyczy tego zespołu.

Powiązane problemy