Laden...

ReflectionTypeLoadException beim Durchsuchen einer Dll per Reflection nach bestimmten Attribut

Erstellt von Kingkook vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.082 Views
K
Kingkook Themenstarter:in
69 Beiträge seit 2011
vor 11 Jahren
ReflectionTypeLoadException beim Durchsuchen einer Dll per Reflection nach bestimmten Attribut

Liebe Com,

ich bekomme bei dem Versuch, eine Dll durch Reflection nach einem bestimmten Attribut zu durchsuchen eine ReflectionTypeLoadException. Die Assembly stammt aus einem früherren Projekt von mir. Bereits bei dem alten Projekt habe ich die Assembly auf gleiche Art durchsucht, damals immer mit erfolg. Bei dem neueren Projekt, wollte ich die gleiche vorgehensweise benutzen.

Ausgelöst wir die Exception schon beim Aufruf von assembly.GetTypes().

Fehlermeldung:
HRESULT : -2146232830
Stack :
bei System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
bei System.Reflection.RuntimeModule.GetTypes()
bei System.Reflection.Assembly.GetTypes()
bei AutomaticTestGUI.ObservableTestPlanFile.ConvertToTestplanFile(String pPath) in Pfad\ObservableTestPlanFile.cs:Zeile 88.

Codeauszug :

            Assembly toCheck = Assembly.LoadFile(pPath);
            try
            {
                foreach(Type _type in toCheck.GetTypes())
                {
                    Console.Write("");
                }
            }
            catch(ReflectionTypeLoadException e)
            {
            }

Woran kann es liegen, dass ich eine dll in einem Projekt perfekt durchsuchen kann, in einem anderen aber nicht.

Gruß Kooki

Edit :

Diesen Log erhalte ich, wenn ich direkt auf die Assembly assembly.GetCustomAttributes(false) aufrufe> Fehlermeldung:

FusionLog :
=== Zustandsinformationen vor Bindung ===
LOG: Benutzer = user
LOG: DisplayName = TestAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///Pfad
LOG: Ursprünglicher PrivatePath = NULL
Aufruf von Assembly : (Unknown).
===
LOG: Diese Bindung startet im default-Load-Kontext.
LOG: Die Anwendungskonfigurationsdatei wird verwendet: Pfad\Test.vshost.exe.Config
LOG: Die Hostkonfigurationsdatei wird verwendet:
LOG: Die Computerkonfigurationsdatei von C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config wird verwendet.
LOG: Die Richtlinie wird derzeit nicht auf den Verweis angewendet (private, benutzerdefinierte, teilweise oder pfadbasierte Assemblybindung)
LOG: Die gleiche Bindung ist bereits aufgetreten und hat den Fehler hr = 0x80070002 verursacht.

F
10.010 Beiträge seit 2004
vor 11 Jahren
5.658 Beiträge seit 2006
vor 11 Jahren

Hi Kingkook,

MSDN schreibt in der Doku:

Eine Instanz enthält das Array von Klassen (Types-Eigenschaft), die im Modul definiert und geladen wurden. Dieses Array kann einige NULL-Werte enthalten. Es ist noch ein weiteres Array von Ausnahmen vorhanden (LoaderExceptions-Eigenschaft). Dieses Array von Ausnahmen stellt die Ausnahmen dar, die durch das Klassenladeprogramm ausgelöst wurden. Die Lücken im Klassenarray entsprechen den Ausnahmen.

Vielleicht solltest du einfach mal in die Exception reinschauen, da gibt es einige Hinweise.

Christian

Weeks of programming can save you hours of planning

K
Kingkook Themenstarter:in
69 Beiträge seit 2011
vor 11 Jahren

Hallo Sparkle,

die LoaderException(s) besagen, dass eine Assembly ( die zu durchsuchende verweist auf darauf) nicht gefunden wird/wurde. Wo muss diese denn liegen, damit Sie erkannt wird?

916 Beiträge seit 2008
vor 11 Jahren

Entweder parallel zu der zu ladenden oder sie ist im GAC registriert. System Assemblies werden automatisch aufgelöst!

Again what learned...

K
Kingkook Themenstarter:in
69 Beiträge seit 2011
vor 11 Jahren

Hätte ich auch gedacht, jedoch selbst wenn ich die Assembly parallel zu der geladenen Assembly zur Verfügung stelle, kommt die Exception.

5.658 Beiträge seit 2006
vor 11 Jahren

die LoaderException(s) besagen, dass eine Assembly ( die zu durchsuchende verweist auf darauf) nicht gefunden wird/wurde. Wo muss diese denn liegen, damit Sie erkannt wird?

Wenn du Aufruf assembly.GetTypes() aufrufst, dann ist die Assembly doch schon geladen (sonst gäb's eine NullReferenceException). Laut Doku wird die Exception aber ausgelöst, "wenn **Klassen **in einem Modul nicht geladen werden können". Daher meine Frage nach den Typen, die in der Exception aufgelistet werden.

Christian

Weeks of programming can save you hours of planning