Позднее связывание
От: xbarmaglot  
Дата: 04.09.12 05:51
Оценка:
У меня есть сторонний COM-объект.
Я добавляю ссылку на него в проекте.
Из сборки виден интерфейс, но не видны его методы.

Создаю объект. Его тип "System.__ComObject";
Получаю его интерфейс и кладу его в карту Dictionary<string, object>.

Если у этого интерфейса дернуть метод, то он отрабатывает.
Но если я по символическому имени пытаюсь найти интерфейс в карте и вызвать его метод

if (m_interfaces.ContainsKey(key))
{
   var find = m_interfaces[key];
   find.GetType().InvokeMethod(method, BindingFlags.InvokeMethod, null, find, args);
}


то получаю исключение

Неизвестное имя. Исключение в HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)


Почему явно я могу вызвать метод интерфейса, а отложено не получается ?
Re: Позднее связывание
От: baranovda Российская Империя  
Дата: 04.09.12 05:55
Оценка:
Здравствуйте, xbarmaglot, Вы писали:

X>У меня есть сторонний COM-объект.

X>Я добавляю ссылку на него в проекте.
X>Почему явно я могу вызвать метод интерфейса, а отложено не получается ?

Потому что реализующий класс не предоставляет TypeInfo, но позволяет дергать свои методы через IDispatch::Invoke
Re[2]: Позднее связывание
От: xbarmaglot  
Дата: 04.09.12 06:00
Оценка:
Здравствуйте, baranovda, Вы писали:

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


X>>У меня есть сторонний COM-объект.

X>>Я добавляю ссылку на него в проекте.
X>>Почему явно я могу вызвать метод интерфейса, а отложено не получается ?

B>Потому что реализующий класс не предоставляет TypeInfo, но позволяет дергать свои методы через IDispatch::Invoke


понятно. а мою проблему можно решить каким-то другим способом, но не явным вызовом, а по символическому имени ?
Re[3]: Позднее связывание
От: baranovda Российская Империя  
Дата: 04.09.12 06:05
Оценка:
Здравствуйте, xbarmaglot, Вы писали:

X>понятно. а мою проблему можно решить каким-то другим способом, но не явным вызовом, а по символическому имени ?


Если разработчик COM-класса понимал, что он делает и намеренно скрыл публичный интерфейс, то через механизмы Reflection — вряд ли. Сильно подозреваю, что речь идёт об 1С.
Re[4]: Позднее связывание
От: xbarmaglot  
Дата: 04.09.12 06:07
Оценка:
Здравствуйте, baranovda, Вы писали:

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


X>>понятно. а мою проблему можно решить каким-то другим способом, но не явным вызовом, а по символическому имени ?


B>Если разработчик COM-класса понимал, что он делает и намеренно скрыл публичный интерфейс, то через механизмы Reflection — вряд ли. Сильно подозреваю, что речь идёт об 1С.


нет — это не 1C. Это COM объект с исходниками. В принципе я могу поправить что-то у него, только мало что понимаю в COM и C#
Исходники помогут ?
Re[5]: Позднее связывание
От: baranovda Российская Империя  
Дата: 04.09.12 06:21
Оценка:
Здравствуйте, xbarmaglot, Вы писали:

Ну смотреть надо. Опрашиваемый интерфейс должен наследоваться от IDispatch (а не IUnknown) и предоставлять реализацию методов GetTypeInfoCount и GetTypeInfo. Тогда скорее всего заработает и Reflection.
Re[5]: Позднее связывание
От: _NN_  
Дата: 04.09.12 16:46
Оценка:
Здравствуйте, xbarmaglot, Вы писали:

X>нет — это не 1C. Это COM объект с исходниками. В принципе я могу поправить что-то у него, только мало что понимаю в COM и C#

X>Исходники помогут ?

А этот COM объект нельзя переписать в .Net сборку ( C#, C++/CLI ) и забыть это все как страшный сон ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.