2010-09-02 5 views
13

Ich versuche, einige Code zu debuggen, die Reflexion PluginsZwei Typen nicht gleich dem auch sein sollte

zu laden verwendet Hier ist der Debugging-Code:

Type a = methodInfo.GetParameters()[0] 
    .ParameterType.BaseType; 
Type b = typeof(MessageContext); 
Debug.WriteLine(a.AssemblyQualifiedName); 
Debug.WriteLine(b.AssemblyQualifiedName); 
Debug.WriteLine(a.Equals(b)); 

Und hier ist seine Ausgabe:

OrtzIRC.Common.MessageContext, OrtzIRC.Common, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = null
OrtzIRC.Common.MessageContext, OrtzIRC.Common, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = Null
Falsch

Ich verstehe nicht, was würden diese beiden Arten unterschiedliche machen?

+0

Was gibt '.UnderlyingSystemType' auf beide zurück? –

+0

@Noon Das Gleiche. –

+1

Na dann. Wurden sie von verschiedenen Klassenladern geladen? –

Antwort

17

derselben Klasse/Typ geladen von verschiedenen Anwendungsdomänen [.NET] oder Klassenlader [Java] nicht gleich vergleichen und sind nicht zuordenbar/voneinander direkt.

Sie haben wahrscheinlich zwei Kopien der DLL, die diesen Typ enthält - eine vom Hauptprogramm geladen und eine von einer der Assembly.Load*(...) Methoden geladen? Versuchen

Anzeigen/Vergleich der Eigenschaften:
a.Assembly.Equals(b.Assembly)
und
a.Assembly.Location.Equals(b.Assembly.Location)

Im Allgemeinen Sie wollen nur eine Kopie jeder DLL und haben es in einer einzigen Anwendungsdomäne geladen.

+2

Sie haben Recht, es wurden zwei Kopien derselben Baugruppe geladen. Einer von ihnen wurde in das Plugins-Verzeichnis kopiert und ich vermute, dass das Plugin dieses anstelle des bereits in der App-Domain geladenen geladen hat. Also löschte ich gerade die Assembly und deaktivierte "Copy local" und es funktionierte. Vielen Dank! –

+0

Tolle Erklärung! : D –

+0

Ich habe ein ähnliches (wenn nicht das gleiche) Problem.Mir ist aufgefallen, dass 'Assembly.Load *' -Funktionen, obwohl sie sich in verschiedenen App-Domänen befinden, die Gleichheit des Typs überprüfen, aber 'Assembly.ReflectionOnlyLoad *' -Funktionen fehlschlagen. Ich würde schätzen, wenn Sie meine Frage überprüfen könnten: http://stackoverflow.com/q/40292593/975724 –

0

Dies ist, wie Sie die Typen vergleichen sollten:

C# Object Type Comparison

Ich denke, Ihr Problem liegt in der Typenhierarchie ...

3

Diese werden aus verschiedenen Versionen geladen, wenn die zwei Arten geschehen kann der Versammlung. .NET betrachtet sie als unterschiedliche, nicht verwandte Typen. Prüfen

Debug.WriteLine (a.AssemblyQualifiedName) ; 
Debug.WriteLine (b.AssemblyQualifiedName) ; 
+0

Beide sind identisch, gleiche Version. –

+1

Dann ist es wahrscheinlich Assembly Loader-Kontext: die 'typeof()' Assembly wird in den Standardkontext geladen, aber 'Assembly.LoadFrom()' und Freunde laden in den LoadFrom-Kontext. Wieder bekommst du verschiedene Arten. Die Problemumgehung besteht darin, zu überprüfen, ob die Assembly bereits in die Appdomain geladen wurde, bevor 'LoadFrom()' 'sie übernimmt. –

+0

* oder * stelle sicher, dass du OrtzIRC.Common in den Standardkontext lädst ('typeof (MessageContext)' sollte dies tun), bevor du mit dem Laden von Plugins beginnst, die auf diese Assembly verweisen. –

0

Versuchen: Debug.Writeline(a.Equals(b));

+0

Gibt immer noch false zurück. –

Verwandte Themen