2010-09-02 19 views
13

próbuję debugowania kodu, który używa refleksji załadować pluginsDwa typy nie równy, które powinny być

Oto kod debugowania:

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

A oto jego produkcja:

OrtzIRC.Common.MessageContext, OrtzIRC.Common, wersja = 1.0.0.0, kultura = neutralny, PublicKeyToken = null
OrtzIRC.Common.MessageContext, OrtzIRC.Common, wersja = 1.0.0.0, Culture = neutral, PublicKeyToken = null
Fałsz

Nie rozumiem, co zmieniłoby te dwa typy?

+0

Co oznacza zwrot ".UnderlyingSystemType" na obu? –

+0

@ WNIEŃ To samo. –

+1

No cóż. Czy były ładowane przez różne ładowarki klasy? –

Odpowiedz

17

tej samej klasy/typu załadowany różnymi domenami aplikacji [.NET] lub ładowarki klasy [Java] nie będzie porównać równe i nie są przypisane do/ze sobą bezpośrednio.

Prawdopodobnie masz dwie kopie biblioteki DLL zawierającej ten typ - jeden załadowany przez program główny i jeden załadowany przez jedną z metod Assembly.Load*(...)?

Spróbuj wyświetlania/porównywania właściwości:
a.Assembly.Equals(b.Assembly)
i
a.Assembly.Location.Equals(b.Assembly.Location)

Ogólnie, trzeba tylko chcieć jedną kopię każdego DLL i go załadować do jednej domenie aplikacji.

+2

Masz rację, ładował dwie kopie tego samego zestawu. Jeden z nich został skopiowany do katalogu wtyczek, więc domyślam się, że wtyczka ładowała tę zamiast tej już znajdującej się w domenie aplikacji. Właśnie usunąłem zespół i wyłączyłem opcję "Kopiuj lokalnie" i zadziałało. Dzięki! –

+0

Świetne wyjaśnienie! : D –

+0

Mam podobny (jeśli nie ten sam) problem.Zauważyłem, że pomimo tego, że znajdują się one w różnych domenach aplikacji, funkcje 'Assembly.Load *' odnoszą sukces w sprawdzaniu równości, ale funkcje 'Assembly.ReflectionOnlyLoad *' zawodzą. Byłbym wdzięczny, gdybyś mógł sprawdzić moje pytanie: http://stackoverflow.com/q/40292593/975724 –

3

może się to zdarzyć, jeśli oba rodzaje są ładowane z różnych wersjach zgromadzenia. .NET uważa je za różne, niepowiązane typy. Sprawdzić

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

Obie są identyczne, ta sama wersja. –

+1

Następnie jest to prawdopodobnie kontekst modułu ładującego: zespół 'typeof()' jest ładowany do domyślnego kontekstu, ale 'Assembly.LoadFrom()' i przyjaciele ładują się do kontekstu LoadFrom. Znowu masz różne typy. Obejście problemu polega na sprawdzeniu, czy zespół został już załadowany do domeny aplikacji przed "LoadFrom()". –

+0

* lub * upewnij się, że ładujesz OrtzIRC.Common do domyślnego kontekstu ('typeof (MessageContext)' powinien zrobić) zanim zaczniesz ładować wtyczki, które odnoszą się do tego zestawu. –

0

Spróbuj: Debug.Writeline(a.Equals(b));

+0

Nadal zwraca wartość false. –

Powiązane problemy