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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вызвать функцию используя invoke 
:(
    Опции темы
dimonpage1
Дата 31.10.2007, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброе утро, есть Dll которая содержит в себе функцию типа List<string>.
из проекта пытаюсь вызвать функцию из dll, но выдает ошибку "Cannot implicitly convert type 'object' to 'System.Collections.Generic.List<string>'."
я понимаю, что компилятор не может конвертировать эти типы.
Но как мне вызвать функцию, может подскажете?

Код

Assembly AccountPC_Load = Assembly.LoadFile("AccountPC.dll");
Type AccountPC_TypeGetInfo = AccountPC_Load.GetType("AccountPC.frmTemp");
object AccountPC_InstGetInfo = Activator.CreateInstance(AccountPC_TypeGetInfo);
MethodInfo meth = AccountPC_TypeGetInfo.GetMethod("GetFormInfo");

List<string> res = new List<string>();

res = meth.Invoke(AccountPC_Inst,null);

PM MAIL   Вверх
tol05
Дата 31.10.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 63
Всего: 170



Цитата(dimonpage1 @  31.10.2007,  09:20 Найти цитируемый пост)
я понимаю, что компилятор не может конвертировать эти типы.

Способы конвертирования типов знаешь? Я пользуюсь этим:
Код

List<string> res = meth.Invoke(AccountPC_Inst,null)  as List<string>;


Это сообщение отредактировал(а) tol05 - 31.10.2007, 10:09


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Wizard_Memfis
Дата 31.10.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 12.2.2007
Где: г. Донецк, Украин а

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



Ну или просто вот так:
Код

List<string> res = (List<string>)meth.Invoke(AccountPC_Inst,null);

Если конечно уверен что возвращает именно этот объект!
Ну а вообще согласен с tol05, проверять все-равно надо полученный объект! smile 
Ну я бы еще вот это добавил:
Код

Assembly AccountPC_Load = Assembly.LoadFile("AccountPC.dll");
Type AccountPC_TypeGetInfo = AccountPC_Load.GetType("AccountPC.frmTemp");
object AccountPC_InstGetInfo = Activator.CreateInstance(AccountPC_TypeGetInfo);
MethodInfo meth = AccountPC_TypeGetInfo.GetMethod("GetFormInfo");
if(meth==null)
{
// в зависимости от проги либо эксепшен бросал или в лог писал!
log.Warn("Can't access GetFormInfo method!");
throw new EXception("Can't access GetFormInfo method!");
}
List<string> res = (List<string>) meth.Invoke(AccountPC_Inst,null);

А дальше уже res проверять! smile 

Это сообщение отредактировал(а) Wizard_Memfis - 31.10.2007, 10:20
--------------------
www.binary-studio.com
PM MAIL WWW ICQ Skype   Вверх
tol05
Дата 31.10.2007, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 63
Всего: 170



Wizard_Memfis, ну если проверять, так уж все до конца проверять.  smile
Цитата(Wizard_Memfis @  31.10.2007,  10:18 Найти цитируемый пост)
List<string> res = (List<string>) meth.Invoke(AccountPC_Inst,null);

этот способ выбросит Exception, если возвращаемый тип не приведется к List<string> (а в моем способе ссылка просто будет равна null). В твоем случае нужно писать
Код

try
{
   List<string> res = (List<string>) meth.Invoke(AccountPC_Inst,null);
}
catch(InvalidCastException ex){}






--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
dimonpage1
Дата 31.10.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



и тем и тем способом пробовал, но выдает в ходе исполнения программы
Object does not match target type.
что это может быть?
PM MAIL   Вверх
Wizard_Memfis
Дата 31.10.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 12.2.2007
Где: г. Донецк, Украин а

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



Согласен tol05, тупанул!Ну тут и спорить нечего, потому что твой способ- это классика хорошего кода! smile

Добавлено через 2 минуты и 1 секунду
А на 
Цитата

и тем и тем способом пробовал, но выдает в ходе исполнения программы
Object does not match target type.
что это может быть?

Все таки функция возвращает не этот тип!Проверь и продебаж!Главное. посмотри что находится в MethodInfo meth, та ли функция которая тебе нада!
--------------------
www.binary-studio.com
PM MAIL WWW ICQ Skype   Вверх
dimonpage1
Дата 31.10.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



сори я static забыл
PM MAIL   Вверх
dimonpage1
Дата 31.10.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



может лучше будет читать из dll глобальную переменную?
public string TEST = "test"
но только я незнаю, как можно получить значение переменной, подскажите?
PM MAIL   Вверх
Wizard_Memfis
Дата 31.10.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 12.2.2007
Где: г. Донецк, Украин а

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



Аналогично:
Код

Assembly AccountPC_Load = Assembly.LoadFile("AccountPC.dll");
Type AccountPC_TypeGetInfo = AccountPC_Load.GetType("AccountPC.frmTemp");
object AccountPC_InstGetInfo = Activator.CreateInstance(AccountPC_TypeGetInfo);
FieldInfo field = AccountPC_TypeGetInfo.GetField("GetFormInfo");
if(field ==null)
{
// в зависимости от проги либо эксепшен бросал или в лог писал!
log.Warn("Can't access GetFormInfo method!");
throw new EXception("Can't access GetFormInfo method!");
}
// Установить значение
object value = "test";
field .SetValue(AccountPC_Load, value); // вот тут мог ошибиться с типом вызывающего объекта 
// AccountPC_Load вообщем тут должен стоять объект, переменную которого ты вызываешь!

// Прочитьтать занчение
field.GetValue(AccountPC_Load);

 smile 
--------------------
www.binary-studio.com
PM MAIL WWW ICQ Skype   Вверх
tol05
Дата 31.10.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 63
Всего: 170



Цитата(Wizard_Memfis @  31.10.2007,  10:31 Найти цитируемый пост)
Согласен tol05, тупанул!Ну тут и спорить нечего, потому что твой способ- это классика хорошего кода!

Но-но, я попросил бы ... не материться...  smile 
dimonpage1, не только сообщение об ошибке давай, но и строку, где она возникает.


Цитата(dimonpage1 @  31.10.2007,  10:48 Найти цитируемый пост)
сори я static забыл

Вызывай через Type.InvokeMember().  Activator.CreateInstance не нужен, причем тут создание инстанса, если статический член типа используется


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
dimonpage1
Дата 1.11.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



tol05, это интересно, а можно примерчик под мой случай подкинуть? smile
PM MAIL   Вверх
tol05
Дата 1.11.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 63
Всего: 170



Код

namespace AccountPC
{
    public class frmTemp
    {
        public static List<string> GetStaticFormInfo()
        {
            return new List<string>(new string[]{"static"});
        }

        public List<string> GetFormInfo()
        {
            return new List<string>(new string[]{"instance"});
        }
    }
}


Код

Assembly AccountPC_Load = Assembly.LoadFile("AccountPC.dll");
Type AccountPC_TypeGetInfo = AccountPC_Load.GetType("AccountPC.frmTemp");
//вызов метода экземпляра
object AccountPC_InstGetInfo = Activator.CreateInstance(AccountPC_TypeGetInfo);
MethodInfo meth = AccountPC_TypeGetInfo.GetMethod("GetFormInfo");
List<string> res = meth.Invoke(AccountPC_InstGetInfo, null) as List<string>;

//вызов статического метода
List<string> resStatic = AccountPC_TypeGetInfo.InvokeMember("GetStaticFormInfo", BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public, null, null, null) as List<string>;

//или так
MethodInfo meth2 = AccountPC_TypeGetInfo.GetMethod("GetStaticFormInfo");
List<string> resStatic2 = meth2.Invoke(null, null) as List<string>;




--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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