Возвращаясь к late binding
От: Аноним  
Дата: 14.12.02 09:07
Оценка:
Так все-таки, может кто-нибудь привести простенький примерчик или хоть намекнуть, как выцепать информацию об интерфейсах и методах из объекта типа Object? Бе приведений типов, а просто так, по подобию извлечения необходимой информации из IDispatch? Слышал уже, что через Reflection, но поточнее можно, а?
Re: Возвращаясь к late binding
От: MikaRSDN Soukhov Stock#
Дата: 14.12.02 09:39
Оценка: 10 (1)
Здравствуйте, Аноним, Вы писали:

А>Так все-таки, может кто-нибудь привести простенький примерчик или хоть намекнуть, как выцепать информацию об интерфейсах и методах из объекта типа Object? Бе приведений типов, а просто так, по подобию извлечения необходимой информации из IDispatch? Слышал уже, что через Reflection, но поточнее можно, а?


object o = GetSomeObject();
Type type = o.GetType();
MethodInfo[] methods = type.GetMethods();

foreach (MethodInfo method in methods)
    object RetVal = method.Invoke(o, new object[]{ /*some arguments*/});
Re[2]: Возвращаясь к late binding
От: Аноним  
Дата: 14.12.02 10:09
Оценка:
Здравствуйте, MikaRSDN Soukhov, Вы писали:

MS>object o = GetSomeObject();

MS>Type type = o.GetType();
MS>MethodInfo[] methods = type.GetMethods();

MS>foreach (MethodInfo method in methods)

MS> object RetVal = method.Invoke(o, new object[]{ /*some arguments*/});

Дык это понятно, батенька. Это я и сам нашел в доке, я думал, что я чего не догоняю. Он мне выдает все в аккурат методы, присущие System.Object. и не больше (кстати, в том числе и абстракные). Пробовал, кстати, GetInterfaces(). Результат — массив нулевой длины of System.Type.

P.S. Только не надо говорить, что мой объект интерфейсы нужные мне не поддерживает, как это однажды уже сказали. Я его в VB передаю, там все нормально. Но некрасиво уж больно писать обертку на VB.
Re[3]: Возвращаясь к late binding
От: Igor Soukhov  
Дата: 14.12.02 10:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Дык это понятно, батенька. Это я и сам нашел в доке, я думал, что я чего не догоняю. Он мне выдает все в аккурат методы, присущие System.Object. и не больше (кстати, в том числе и абстракные). Пробовал, кстати, GetInterfaces(). Результат — массив нулевой длины of System.Type.


все работает :

* thriving in a production environment *
Re[4]: Возвращаясь к late binding
От: Аноним  
Дата: 14.12.02 11:01
Оценка:
Здравствуйте, Igor Soukhov, Вы писали:

IS>все работает :


У меня тоже работает, если так. Предыстория: есть некое приложение (не мое), для которого делается COM-плагин. Плагин должен содержать интерфейс с методом, принимающим при запуске от приложения объект автоматизации этого самого приложения в виде IDispatch.
Дальше: пишу COM-объект на C#. Вышеупомянутый метод выглядит так:

void ExternalRunCommand(...[In, MarshalAs(UnmanagedType.IDispatch)] object kompas);

Вот я получаю в своей бибке этот самый обьект. Его тип — АБСОЛЮТНО ГОЛЫЙ System.Object (извини за крик, но я уже целую неделю парюсь, объясняя всем это!). И нет в нем никакой инфы об актуальном типе, никакой!
Понятно, что выцепить нужную мне инфу все же можно — Васик же выцепает. Но как???
Re[5]: Возвращаясь к late binding
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.12.02 11:11
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>У меня тоже работает, если так. Предыстория: есть некое приложение (не мое), для которого делается COM-плагин. Плагин должен содержать интерфейс с методом, принимающим при запуске от приложения объект автоматизации этого самого приложения в виде IDispatch.

А>Вот я получаю в своей бибке этот самый обьект. Его тип — АБСОЛЮТНО ГОЛЫЙ System.Object (извини за крик, но я уже целую неделю парюсь, объясняя всем это!). И нет в нем никакой инфы об актуальном типе, никакой!

Естественно, это ж ком. Ты вот это почитай

ms-help://MS.NETFrameworkSDK/cpguidenf/html/cpconinteroperatingwithunmanagedcode.htm
... << RSDN@Home 1.0 beta 3 (np: тихо) >>
AVK Blog
Re[6]: Возвращаясь к late binding
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 14.12.02 11:16
Оценка:
Здравствуйте, AndrewVK, Вы писали:


А>>Вот я получаю в своей бибке этот самый обьект. Его тип — АБСОЛЮТНО ГОЛЫЙ System.Object (извини за крик, но я уже целую неделю парюсь, объясняя всем это!).


"Вынеси" все нужные тебе функции из объекта в интерфейс. А потом к ниму приводи и дергай методы.

Интерфейсы сохраняются в tlb и передаются нормально, а не как голый IDispatch
... << RSDN@Home 1.0 beta 3 >>
Re[6]: Возвращаясь к late binding
От: Аноним  
Дата: 14.12.02 11:23
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Естественно, это ж ком. Ты вот это почитай


Ну прямо добрый волшебник! ЭТО я перечитывал уже раз 10. Проблем с этим нет, понимаешь? Подключаю COM-бибку, все нормально,есть нэймспейс, есть типы, управляемые уже. Могу какой хошь создать объект, как хошь могу вертеть и типы приводить. Но ЗДЕСЬ-то как быть, когда этот Object (чтоб ему неладно было) передает этот грёбаный маршалер (и ему тоже)???
Re[7]: Возвращаясь к late binding
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 14.12.02 11:29
Оценка:
Здравствуйте, <Аноним>, Вы писали:

A> Но ЗДЕСЬ-то как быть, когда этот Object (чтоб ему неладно было) передает этот грёбаный маршалер (и ему тоже)???


Повторяю: Передавай не Object, а интерфейс
... << RSDN@Home 1.0 beta 3 >>
Re[7]: Возвращаясь к late binding
От: Аноним  
Дата: 14.12.02 11:29
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>"Вынеси" все нужные тебе функции из объекта в интерфейс. А потом к ниму приводи и дергай методы.


DG>Интерфейсы сохраняются в tlb и передаются нормально, а не как голый IDispatch


Именно к интерфейсу я и пытаюсь приводить.
Есть интерфейс SomeInterface, пишу:

SomeInterface interface=(SomeInterface)obj;

Говорит, что инвалидный тайпкастинг.
Re[8]: Возвращаясь к late binding
От: Аноним  
Дата: 14.12.02 11:32
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>Повторяю: Передавай не Object, а интерфейс


Ты имеешь в виду примерно это:

ExternalRunCommand(...[In, MarshalAs(UnmanagedType.IDispatch)] object kompas) ?

Пробовал. То же самое. Похоже, он пытается кастинг произвести еще раньше, вот и все.
Re[9]: Возвращаясь к late binding
От: Аноним  
Дата: 14.12.02 11:35
Оценка:
Блин, забыл поменять. Я хотел сказать так:

ExternalRunCommand(...[In, MarshalAs(UnmanagedType.IDispatch)] SomeInterface kompas) ?
Re[8]: Возвращаясь к late binding
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 14.12.02 11:40
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Говорит, что инвалидный тайпкастинг.


Покажи код.
1. Описание класса на .Net
2. Получение его на клиенте
... << RSDN@Home 1.0 beta 3 >>
Re[9]: Возвращаясь к late binding
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 14.12.02 11:40
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>ExternalRunCommand(...[In, MarshalAs(UnmanagedType.IDispatch)] object kompas) ?


Где-то у тебя глюки или не понимание...
Покажи код.

зы.
И зарегся что-ли...
... << RSDN@Home 1.0 beta 3 >>
Re[10]: Возвращаясь к late binding
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 14.12.02 11:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>ExternalRunCommand(...[In, MarshalAs(UnmanagedType.IDispatch)] SomeInterface kompas) ?


А нужно обязательно маршалить, как IDispatch?
... << RSDN@Home 1.0 beta 3 >>
Re[8]: Возвращаясь к late binding
От: MikaRSDN Soukhov Stock#
Дата: 14.12.02 16:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, DarkGray, Вы писали:


DG>>"Вынеси" все нужные тебе функции из объекта в интерфейс. А потом к ниму приводи и дергай методы.


DG>>Интерфейсы сохраняются в tlb и передаются нормально, а не как голый IDispatch


А>Именно к интерфейсу я и пытаюсь приводить.

А>Есть интерфейс SomeInterface, пишу:

А> SomeInterface interface=(SomeInterface)obj;


А>Говорит, что инвалидный тайпкастинг.


Лучше бы код привести Но
1) Ты уверен что твой obj наследуем от SomeInterface?
2) Если он наследуем то тогда бы почему не передавать его самого (SomeInterface)?
Re[11]: Возвращаясь к late binding
От: Dmitry Sergeev Россия  
Дата: 15.12.02 05:38
Оценка:
Здравствуйте, DarkGray, Вы писали:

А>>ExternalRunCommand(...[In, MarshalAs(UnmanagedType.IDispatch)] SomeInterface kompas) ?


DG>А нужно обязательно маршалить, как IDispatch?


Ну этот самый Компас-График, который мою либку должен вызывать, заточен под то, чтобы IDispatch передавать.
Re[11]: Возвращаясь к late binding
От: Dmitry Sergeev Россия  
Дата: 15.12.02 05:41
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>А нужно обязательно маршалить, как IDispatch?


А ваще я то, что IDispatch надо именно так маршалить, и именно с objectом, я в примере нашел MSDN. А что, можно какнить по-другому?
Re[5]: Возвращаясь к late binding
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 15.12.02 11:23
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вот я получаю в своей бибке этот самый обьект. Его тип — АБСОЛЮТНО ГОЛЫЙ System.Object (извини за крик, но я уже целую неделю парюсь, объясняя всем это!). И нет в нем никакой инфы об актуальном типе, никакой!


Тебе именно нужна информация о типе? Или нужно просто повызывать методы?
... << RSDN@Home 1.0 beta 3 >>
Re[6]: Возвращаясь к late binding
От: Dmitry Sergeev Россия  
Дата: 15.12.02 12:55
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>Тебе именно нужна информация о типе? Или нужно просто повызывать методы?


Ну, вообще-то в ЭТОМ случае только повызывать методы. А в остальных проблем с информацией и не бывает.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.