Type.IsSubclassOf не работает должным образом - PullRequest
4 голосов
/ 16 июля 2009

У меня есть приложение, которое загружает сборки и ищет типы, которые являются подклассами класса C1, определенного в другой сборке A1, на которую ссылается приложение. Я определил тип T в A1, который является подклассом C1, но когда я загружаю A1, используя Assembly.Load (...), затем вызываю t.IsSubclassOf (typeof (C1)) для экземпляра T, я получаю false. Я заметил, что в текущем домене приложения есть 2 экземпляра сборки A1, и t.IsSubclassOf (C1) работает, если я выбираю тип C1 из одного из экземпляров, но не оба. Я не совсем понимаю это поведение, кто-нибудь может объяснить? Кроме того, как я могу исправить свое приложение, чтобы оно работало, загружать ли A1 или какую-либо другую сборку для поиска подтипов C1?

Ответы [ 3 ]

5 голосов
/ 16 июля 2009

Чтобы CLR однозначно идентифицировал типы, он включает информацию о сборке в идентификатор типа. Ваша проблема в том, что CLR классифицирует два экземпляра A1 как разные сборки, поэтому вы эффективно выполняете:

A1::T1.IsSubClassOf(A1Copy::C1)  // No relationship between A1 and A1Copy

... вместо:

A1::T1.IsSubClassOf(A1::C1)

Сборка уникально идентифицируется по имени, версии, культуре и общедоступному ключу. Проверьте эти значения (через Assembly.GetName()) из обоих экземпляров сборки в домене приложения; Я подозреваю, что в одном из атрибутов имеется несоответствие, из-за которого CLR загружает поврежденную сборку.

2 голосов
/ 17 июля 2009

Да, я только что построил два проекта с этим, я определил в одном проекте родительские и дочерние классы:

namespace ClassLibrary1
{
    public class Parent
    {
        public string name;
    }

    public class Child : Parent
    {
    }
}

, а затем попытался загрузить информацию:

 {
        Type parent = typeof(Parent);
        Type c1 = typeof(Child);
        bool isChild1  = (c1.IsSubclassOf(parent).ToString());

        Assembly a = Assembly.Load(File.ReadAllBytes("ClassLibrary1.dll"));
        Type c2 = a.GetType(c1.FullName);
        bool isChild2 = (c2.IsSubclassOf(parent).ToString());
    }

и я получил isChild1 = true, а isChild2 = false.

Проверка Сюзанны Кук по этой ссылке при загрузке контекстов предоставила еще больше света:

http://blogs.msdn.com/suzcook/archive/2003/06/13/57180.aspx

0 голосов
/ 15 апреля 2011

Домен приложений, в который вы загружаете сборку (используя Assembly.Load()), может вызывать проблемы.

Вместо использования Assembly.Load() используйте AppDomain.CurrentDomain.Load(). Это гарантирует, что сборка будет загружена в CurrentDomain, где вы можете его использовать.

Проверьте эту статью для получения дополнительной информации:

http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx

...