2016-05-09 18 views
6

EDIT: Ich habe keine erwähnt wichtige Sache - Anwendung, die meine Assemblys lädt, sind eigentlich nicht im selben Verzeichnis (wie andere DLLs) . Nachdem ich mit dem Fusionsprotokoll herumgespielt hatte, bemerkte ich, dass sich das Laden von dll anders verhält, als ich bisher dachte. (Yup, ich sollte zuerst RTFM, Schande über mich)Konnte den Typ `A` nicht laden aus der Baugruppe` Not.Containing.Type.A`

  • C:\Test\appLoadingStuff.exe
  • C:\Lib\Acme.Application.dll
  • C:\Lib\Acme.Data.dll
  • ...

.NET Base Sondieren Anwendung (außer GAC und Sachen ; Verzeichnis, in dem App geladen wird - C:\Test\), und kümmert sich nicht um den Speicherort, wo dll geladen sind (anderes Verzeichnis).


Während das .NET-Framework fand ich mich immer eine ReflectionTypeLoadException Ausnahme:

System.TypeLoadException

kann nicht eine oder mehrere der angeforderten Typen laden. Rufen Sie die LoaderExceptions-Eigenschaft für weitere Informationen auf.

konnte nicht geladen Typ 'Acme.Data.Foo' aus Assembly 'Acme.Data.Dao, Version = 1.1.0.4, Culture = neutral, PublicKeyToken = null'. ":" Acme.Data.Foo

ich habe, der Einfachheit halber, 3 Baugruppen:

  • Acme.Application meine Hauptbaugruppe
  • Acme.Data meine Datenobjekte (durch 1. ein referenzierten)
  • Acme.Data.Dao objec meine Datenzugriff ts (referenziert von 1.)

Und es gibt eine andere Anwendung, die tatsächlich meine Hauptbaugruppe lädt. Alle .dll Dateien befinden sich im selben Verzeichnis.

Wie Sie erwarten können, ist der Typ Acme.Data.Foo in Assemblylebend. Trotzdem versucht .NET, es in einer anderen Assembly zu finden Acme.Data.Dao - was fehlschlägt, da der Typ nicht da ist.

Ich kann nicht herausfinden, was macht .NET für diesen bestimmten Typ in falscher Montage suchen. Ausnahme wird sofort ausgelöst, wenn Typen auf Montag Zugriff:

System.Reflection.RuntimeAssembly assembly = Assembly.LoadFile("C:\Lib\Acme.Application.dll") 
var types = assembly.GetTypes(); // -> explodes 

Als ich versuchte, referenzierten Baugruppen zu überprüfen mit:

assembly.GetReferencedAssemblies() 

Ich kann meine gewünschte Anordnung in der Liste klar sehen.

Es gibt keine Assembly Redirect (und soweit ich weiß, betrifft dies nur die Version). Versionen von Baugruppen sind korrekt.

Worauf sollte ich noch achten?

+0

Gibt es weitere Details in den 'LoaderExceptions', die von der Ausnahmebedingungsnachricht vorgeschlagen werden, oder ist das die zweite Nachricht im Post? –

+0

@MartinCostello Ja, das ist im Grunde die zweite Nachricht - die nur halb Sinn macht (Typ ist wirklich nicht da, aber Assembly wo Typ ist referenziert also warum es dort sucht) –

+0

Könnte jemand bitte das "Assembly" -Tag entfernen? Ich habe versehentlich meine "Bearbeiten" -Abstimmung bei einer Bearbeitung verschwendet. –

Antwort

1

Wie ich in der bearbeiteten Frage gesagt habe, habe ich verpasst, sehr wichtige Eigenschaft von dem zu erwähnen, was ich versuchte zu tun. Meine Baugruppe wurde von einer anderen Anwendung geladen, die sich nicht in demselben Pfad befand wie als geladene Baugruppen.

.NET untersucht Verzeichnis der laufenden Anwendung, nicht Verzeichnisse, in denen geladene DLLs sind. Wenn ein solcher Fall behandelt werden muss, ist es notwendig, den Ereignisbehandler AppDomain.AssemblyResolve zu implementieren, um Abhängigkeiten von geladenen dll zu berücksichtigen.

More reading:

Dank an alle, die zu dieser Frage teilgenommen und traurig, dass ich nicht teilen so wichtige Details (tbh, ich habe nicht erwartet, dass dieses kleine Detail zählt - jetzt weiß ich).

Verwandte Themen