ПК>Но почему-то при приведении типа от object возникает исключение System.InvalidCastException - "Specified cast is not valid."
ИМХО тут надо было делать не так. Лучше проверять наличие интерфейса не по текстовуму имени, а по типу. А причина может быть в том, что ты просто объявил два разных интрефейса с одним и тем же именем — ITest в двух этих модулях?
Просто из твоего постинга не совсем понятно — есть ли взаимосвязь между модулями на уровне метаданных.
выполняется без проблем, т.е. конструктор данного класа вызывается
D_S>А причина может быть в том, что ты просто объявил два разных интрефейса с одним и тем же именем — ITest в двух этих модулях?
Специально сделал тестовые модули в одном из которых всего один интерфейс и класс его _реализующий_, а во втором никаких интерфейсов нет.
D_S>Просто из твоего постинга не совсем понятно — есть ли взаимосвязь между модулями на уровне метаданных.
В управляющем модуле есть Reference на первый модуль где собственно и описан интерфейс, который нужно получить от My_object
Попросту говоря сборки находятся в разных местах в файловой системе, для проверки этого посмотрите свойство typeof(LIB_TEST.ITest).Assembly.Location и у CurrentAssembly.Location.
Здравствуйте, Павел Киселев, Вы писали:
D_S>>ИМХО тут надо было делать не так. Лучше проверять наличие интерфейса не по текстовуму имени, а по типу.
ПК>Да дело то в том, что ПК>
ПК>выполняется без проблем, т.е. конструктор данного класа вызывается
Ну и что?! какого такого "данного". Ты просто перебираешь типы в сборке и для некоего типа, который реализует интерфейст с именем LIB_TEST.ITest, создаешь его экземпляр. Что тут такого?
Здравствуйте, Павел Киселев, Вы писали:
ПК>Специально сделал тестовые модули в одном из которых всего один интерфейс и класс его _реализующий_, а во втором никаких интерфейсов нет.
ПК>В управляющем модуле есть Reference на первый модуль где собственно и описан интерфейс, который нужно получить от My_object
Здравствуйте, Павел Киселев, Вы писали:
ПК>Специально сделал тестовые модули в одном из которых всего один интерфейс и класс его _реализующий_, а во втором никаких интерфейсов нет.
И все же попробуй вместо поиска интерфейса по текстовому имени делать поиск по typeof
И еще попробуй заменить LoadFrom на что-нибудь другое аналогичное
Здравствуйте, Dr_Sh0ck, Вы писали:
D_S>Здравствуйте, Павел Киселев, Вы писали:
ПК>>Специально сделал тестовые модули в одном из которых всего один интерфейс и класс его _реализующий_, а во втором никаких интерфейсов нет.
D_S>И все же попробуй вместо поиска интерфейса по текстовому имени делать поиск по typeof D_S>И еще попробуй заменить LoadFrom на что-нибудь другое аналогичное
M>Лучше сделать так M>Debug.Assert(typeof(IMyInterface).FullName == myObject.GetType().GetInterfaces()[0].FullName)
а чем это лучше? воспользоваться интерфейсом все равно не удастся. не через Invoke же вызывать методы.
Здравствуйте, Алексей Одинцов, Вы писали:
M>>Лучше сделать так M>>Debug.Assert(typeof(IMyInterface).FullName == myObject.GetType().GetInterfaces()[0].FullName) АО>а чем это лучше? воспользоваться интерфейсом все равно не удастся. не через Invoke же вызывать методы.
Это поможет разобраться где у тебя глюк в программе
Здравствуйте, Алексей Одинцов, Вы писали:
M>>Лучше сделать так M>>Debug.Assert(typeof(IMyInterface).FullName == myObject.GetType().GetInterfaces()[0].FullName) АО>а чем это лучше? воспользоваться интерфейсом все равно не удастся. не через Invoke же вызывать методы.
Это код для проверки. Так быстрее локализовать проблемы. Если исключение на строчке будет, то
Здравствуйте, mikа, Вы писали:
имхо, и так ясно, что у него не совпадают типы. и чтобы пользоваться ранним связыванием, ему надо использовать интерфейс определенный на этапе компиляции, а не загруженный неизвестно когда.
а с тем что из ассембли ему по-любому придется динамически работать.
Здравствуйте, Алексей Одинцов, Вы писали:
АО>Здравствуйте, mikа, Вы писали: АО>имхо, и так ясно, что у него не совпадают типы.
Почему же Я могу привести кучу примеров почему этот код может выдавать ошибку при одинаковых интерфейсах.
АО>и чтобы пользоваться ранним связыванием, ему надо использовать интерфейс определенный на этапе компиляции, а не загруженный неизвестно когда.
К чему ты это вообще сказал?
АО>а с тем что из ассембли ему по-любому придется динамически работать.
?? Я написал код для того, чтобы проверить ралидность Если не работает, значит нужно посмотректь что откуда берется (это тоже написал) Какие поздние связывание? К чему ты это вообще?
Здравствуйте, Алексей Одинцов, Вы писали:
АО>1. уберите референс на модуль TEST_LIB. АО>2. перенесите интерфейс ITest в приложение. АО>3. попробуйте еще раз.
Перенес, получил ExecutingAssembly, далее по коду все как и было.
Все получилось, но почему тогда не работает так как написано у меня?
Здравствуйте, mikа, Вы писали: M>?? Я написал код для того, чтобы проверить ралидность Если не работает, значит нужно посмотректь что откуда берется (это тоже написал) Какие поздние связывание? К чему ты это вообще?
к тому что он пишет
этот код не скомпилится, если нет информации об интерфейсе LIB_TEST.ITest. Если в загруженном модуле интерфейс другой — не произойдет и (LIB_TEST.ITest)My_object, если класс не реализует именно этот интерфейс.
а если он загрузил библиотеку с каким-то там интерфейсом, как бы он там не назывался, ему придется вызывать методы этого интерфейса через рефлекшн, если этот интерфейс не ассоциирован с имеющимися.
Здравствуйте, Павел Киселев, Вы писали: ПК>Перенес, получил ExecutingAssembly, далее по коду все как и было. ПК>Все получилось, но почему тогда не работает так как написано у меня?
а это надо mika спросить. он походу шарит.
имхо просто потому что из разных ассемблей взято. но видимо можно как-то и срастить.
Здравствуйте, Павел Киселев, Вы писали: ПК>Перенес, получил ExecutingAssembly, далее по коду все как и было. ПК>Все получилось, но почему тогда не работает так как написано у меня?
при сравнении типов Type.Equals( Type t2 )
судя по IL (если не напутал) идет сравнение по ссылкам
src.UnderlyingSystemType и t2.UnderlyingSystemType
и похоже если их (ассемблей) 2, то типы эти возвращают разные ссылки как это разрулить я