2010-09-02 2 views
13

Я пытаюсь отлаживать код, который использует отражение для загрузки плагиновДва типа не равны, что должно быть

Вот код отладки:

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

А вот его вывод:

OrtzIRC.Common.MessageContext, OrtzIRC.Common, Version = 1.0.0.0, культура = нейтральной, PublicKeyToken = нуль
OrtzIRC.Common.MessageContext, OrtzIRC.Common, Version = 1.0.0.0, культура = нейтральной, PublicKeyToken = Нуль
Ложные

Я не понимаю, что бы эти два типа отличаются?

+0

Что возвращает '.UnderlyingSystemType' на обоих из них? –

+0

@Noon То же самое. –

+1

Ну тогда. Были ли они загружены различными загрузчиками классов? –

ответ

17

Тот же класс/тип загружен различными доменами приложений [.NET] или загрузчиков классов [Java] не будет сравнивать равны и не могут быть переданы в/друг от друга непосредственно.

Возможно, у вас есть две копии DLL, содержащие этот тип: один загружен основной программой и один загружен одним из методов Assembly.Load*(...)?

Попробуйте отображения/сравнения свойств:
a.Assembly.Equals(b.Assembly)
и
a.Assembly.Location.Equals(b.Assembly.Location)

В общем, вы хотите только одну копию каждой DLL и он загружается в один домен приложения.

+2

Вы правы, это была загрузка двух копий той же сборки. Один из них был скопирован в каталог плагинов, и поэтому я думаю, что плагин загружал этот, а не тот, который уже находится в домене приложения. Поэтому я просто удалил сборку и отключил «Копировать локально», и это сработало. Благодаря! –

+0

Отличное объяснение! : D –

+0

У меня подобная проблема (если не та же).Я заметил, что, несмотря на то, что в разных доменах приложений функции 'Assembly.Load *' успешно проверяются на равенство типов, а функции Assembly.ReflectionOnlyLoad *' терпят неудачу. Я был бы признателен, если бы вы могли проверить мой вопрос: http://stackoverflow.com/q/40292593/975724 –

0

Это, как вы должны сравнить типы:

C# Object Type Comparison

Я думаю, ваша проблема заключается в иерархии типов ...

3

Это может произойти, если два типа загружается из разных версий сборки. .NET рассматривает их разные, несвязанные типы. Проверить

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

Оба идентичны, в той же версии. –

+1

Тогда это, вероятно, контекст загрузчика сборки: сборка 'typeof()' загружается в контекст по умолчанию, но 'Assembly.LoadFrom()' и друзья загружаются в контекст LoadFrom. Снова вы получаете разные типы. Обходной путь - проверить, загружена ли сборка в appdomain до 'LoadFrom()' 'ing. –

+0

* или * убедитесь, что вы загрузили OrtzIRC.Common в контекст по умолчанию ('typeof (MessageContext)' должен делать), прежде чем вы начнете загружать плагины, ссылающиеся на эту сборку. –

0

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

+0

Все еще возвращает false. –

Смежные вопросы