Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу загрузить интерфейс при позднем связывании 
:(
    Опции темы
VisualProgrammerNET
Дата 16.5.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



Есть некая сборка под названием BaseLocation. Код (всё лишнее вырезал):
Код

namespace BaseLocation
{
    public partial class BaseLocation : Form, Globals.Globals.ICreat3BaseLocation
    {        
        bool isbase = true;        
        public bool IsBaseLocation() { return isbase; }
        public string GetBaseLocationName() { return this.Text; }        
    }
}   

Интерфейс определён в другой сборке, под названием Globals (в BaseLocation есть референс на Globals, само собой). Код:
Код

namespace Globals
{
    public class Globals
    {
        public interface ICreat3Location
        {
            bool IsLocation();
            string GetBaseLocation();
            string GetLocationName();
        }

        public interface ICreat3BaseLocation
        {
            bool IsBaseLocation();
            string GetBaseLocationName();
        }
    }
}

Обе сборки лежат на харде. Пишу программу, которая сканирует папку (в ней пока только BaseLocation.dll) на лежащие в ней .dll, и проверяет, являются ли они подходящими. Написал вот что:
Код

Assembly asmb;

void SomeMethod()
{
            FileInfo fi;
            string[] files = Directory.GetFiles(Application.StartupPath + @"\Locations\Level1");            
            foreach (string s in files)
            {                
                fi = new FileInfo(s);
                if (fi.Extension == ".dll")
                {
                    try
                    {
                        asmb = Assembly.LoadFile(s);
                        Type baseloc = asmb.GetType("BaseLocation.BaseLocation");
                        object obj = Activator.CreateInstance(baseloc);
                        MethodInfo mi = baseloc.GetMethod("IsBaseLocation");
                        MessageBox.Show(mi.Invoke(obj, null).ToString());                        
                    }
                    catch (Exception exc)
                    {
                        MessageBox.Show(exc.ToString());                        
                    }
                }
}

Всё обламывается на строчке Type baseloc = asmb.GetType("BaseLocation.BaseLocation"). Вылетает ошибка, что интерфейс ICreat3BaseLocation не может быть загружен из сборки Globals. Пробовал загрузить его отдельно,
Код

asmb2 = Assembly.LoadFile(Application.StartupPath + @"\Globals.dll");
Type IC3BL = asmb2.GetType("Globals.Globals.ICreat3BaseLocation");

, не загружается. Я добавил референс на Globals.dll - всё равно ничего не работает...  smile  Ни один интерфейс не грузится... Полдня сижу, никак не могу понять, в чём беда...  smile   

Это сообщение отредактировал(а) VisualProgrammerNET - 16.5.2006, 17:44


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
Exception
Дата 16.5.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Учись работать с дебугом. Запускаешь Immediate и пишешь
Код

? asmb.GetTypes()


Погляди, какие там типы и их имена. Из них делай выводы, что не так. 
PM   Вверх
VisualProgrammerNET
Дата 16.5.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



Immediate - это чо?  smile Где такой запускать? 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
arilou
Дата 16.5.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Чтобы заюзать такой тип через GetType, надо написать qualified type name:

Код

namespace Globals
{
    public class Globals
    {
        public interface ICreat3Location



Т.е.
Код

Type t = asm.GetType("Globals.Globals+ICreat3Location");


Вопрос в том, нафига запихивать определение интерфейса внутрь класса, имя которого совпадает с именем namespace'а  smile  


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
VisualProgrammerNET
Дата 16.5.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



Цитата(arilou @  16.5.2006,  19:01 Найти цитируемый пост)
Чтобы заюзать такой тип через GetType, надо написать qualified type name


Ммм... но ведь исключение вылетат на строке 
Код

Type baseloc = asmb.GetType("BaseLocation.BaseLocation");


BaseLocation только реализует интерфейс, но не является таковым. Зачем вообще этому классу понадобился интерфейс? И куда мне сувать этот самый Qualified type name?  smile   


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
VisualProgrammerNET
Дата 16.5.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



Нашёл проблему. Оказывается, загружал недоработанную версию сборки, не поддерживающую интерфейс  smile 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
VisualProgrammerNET
Дата 16.5.2006, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



Теперь такой вопрос. Мне в проекте известен тип BaseLocation. Я, вышеизложенным путём, проверяю, есть ли в исследуемой сборке этот тип. Если получаю ответ "да", то надо создать экземпляр BaseLocation из этой сборки и добавить его в список. Но вся проблема в том, что - явно или неявно - нельзя привести тип Type к известному BaseLocation. Есть ли какие-нибудь способы создать список или массив объектов, загруженных динамически? В данном случае, массив BaseLocation. 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
Void
Дата 16.5.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



VisualProgrammerNET, не совсем понял. Ты хочешь из экземпляра Type получить экземпляр типа, который он описывает? См. Activator.CreateInstance. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
VisualProgrammerNET
Дата 17.5.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



Не, смотри. У меня в проекте объявлен тип BaseLocation. Есть типизированный список List <BaseLocation>. Я программно загружаю сборку, содержащую так же этот тип. Но вся проблема в том, что

Type baseloc = asmb.GetType("BaseLocation.BaseLocation");    
(BaseLocation)object obj = (BaseLocation)Activator.CreateInstance(baseloc);

работать не будет. Вылетает исключение "не удалось привести тип BaseLocation к типу BaseLocation. Почему не удаётся? 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
arilou
Дата 17.5.2006, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



VisualProgrammerNET, потому что сборки ссылаются на разные типы BaseLocation - либл находящиеся в разных сборках, либо в разных неймспейсах! 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
VisualProgrammerNET
Дата 22.5.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



А можно как-нить всё таки привести один тип к другому?  

Это сообщение отредактировал(а) VisualProgrammerNET - 22.5.2006, 16:58


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
arilou
Дата 22.5.2006, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



VisualProgrammerNET, нельзя. Ты объясни, зачем?? Проблема-то явно в другом. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Exception
Дата 22.5.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Архитектуру покажи. Чую я, что-то не то ты замутил smile  
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.