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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация RPC 
:(
    Опции темы
gpepsi
Дата 31.8.2012, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На машине существуют COM объекты,  которые реализуют некоторые интерфейсы.
С другой машины необходимо удаленно вызывать методы интерфейса.

Задача 1: уйти от COM объектов создав некую абстракцию.
Задача 2: сделать это максимально платформонезависимо.

В голову пришел простой способ реализации на основе JSON.
Передача данных по сети Tcp-клиентом (может быть механизм более высокого уровня).

Сначала попытался реализовать каждый метод.

Например:
Код

class IComObject1
{
    void method1();
    void method2();
    ...
    void methodN();
}
...
class IComObjectN
{
    void method1();
    void method2();
    ...
    void methodN();
}

class JsonCmds
{
    public static readonly METHOD_ICOMOBJECT1_METHOD1 = "IComObject1.method1";
    ...
    public static readonly METHOD_ICOMOBJECTN_METHODN = "IComObjectN.methodM";
}


Соответственно, получив JSON запрос я просто проверяю метод и вызываю нужный.
В рельтате получается офигенный if/else if т.к. методов много.

Также возникает проблема с передвчей аргументов. Каждый метод должен знать какие аргументы каких типов 
должны быть переданы.

Хотелось бы это унифицировать. Например, по типу класса найти нужный объект и вызвать метод по строковому имени.
Только типы класса и методы передаются как строки.

Можно ли это реализовать ?
PM MAIL   Вверх
Cheloveck
Дата 1.9.2012, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



Может не нужно изобретать велосипед и воспользоваться WCF?


--------------------
user posted image
PM Jabber   Вверх
gpepsi
Дата 1.9.2012, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Cheloveck @  1.9.2012,  02:24 Найти цитируемый пост)
Может не нужно изобретать велосипед и воспользоваться WCF? 

я же говорил - платформонезависимо.

P.S. тут искал и нашел всякие Type и GetMethod. Может как это прикрутить можно ?
PM MAIL   Вверх
diadiavova
Дата 1.9.2012, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(gpepsi @  1.9.2012,  09:15 Найти цитируемый пост)
я же говорил - платформонезависимо.

Хочешь сказать, что машина, на которой "существуют" COM-объекты не под виндой работает? smile Если кроссплатформенность требуется для удаленной машины, то с WCF никаких проблем не возникнет, поскольку данными машины будут обмениваться с помощью XML или JSON, да и WSDL описание сервиса тоже будет сгенерировано.
Цитата(gpepsi @  1.9.2012,  09:15 Найти цитируемый пост)
P.S. тут искал и нашел всякие Type и GetMethod. Может как это прикрутить можно ? 

Можно, правда дать подробные инструкции трудно, поскольку не совсем понятно, как ты работаешь с COM. Обычно сборка взаимодействия генерится сама при добавлении ссылки на библиотеку или с помощью утилиты tlbimp. Но если ты все сам делаешь, то конкретно для твоего случая порядок действий примерно таков:
В пространстве System.Reflection находится почти все, что понадобится. Assembly - этот класс содержит ряд статических методов, с помощью которых можно получить ссылку на сборку. Далее вызываешь у нее метод CreateInstance для получения экземпляра, для этого правда придется передать ему полное имя класса, но если они все в одном пространстве имен - это не проблема. Получив экземпляр для получения Type вызови у него GetType, далее GetMethod( ему надо передать имя и опять-таки строкой, как тебе и надо), ну а уже у метода Invoke


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Cheloveck
Дата 1.9.2012, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



Цитата(gpepsi @  1.9.2012,  09:15 Найти цитируемый пост)
я же говорил - платформонезависимо.


Цитата(diadiavova @  1.9.2012,  11:04 Найти цитируемый пост)
с WCF никаких проблем не возникнет, поскольку данными машины будут обмениваться с помощью XML или JSON, да и WSDL 

Можно использовать WCF Data Services и экспозить OData, клиенты для которой есть для многих платформ.


--------------------
user posted image
PM Jabber   Вверх
gpepsi
Дата 2.9.2012, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(diadiavova @  1.9.2012,  10:04 Найти цитируемый пост)
Хочешь сказать, что машина, на которой "существуют" COM-объекты не под виндой работает?

до этом машины пофигу. Вопрос к машине управления (хоть наладонник, хоть PC,...)

Цитата(diadiavova @  1.9.2012,  10:04 Найти цитируемый пост)
Получив экземпляр для получения Type вызови у него GetType

Я создаю экземпляры COM. Получается, что мне нужно после создания держать карту
Map<String, Object>, чтоб можно было найти по имени типа нужный COM ?

Цитата(diadiavova @  1.9.2012,  10:04 Найти цитируемый пост)
алее GetMethod( ему надо передать имя и опять-таки строкой, как тебе и надо),

это понятно

Цитата(diadiavova @  1.9.2012,  10:04 Найти цитируемый пост)
 ну а уже у метода Invoke

вот тут тоже проблема. Число и тип аргументов различны. Как выэывать методы через Invoke ?
Ведь сигнатуру метода знает только вызывающий код (на управляющей машине). А код на стороне COM хотелось бы вызывать универсально.

Может ли Invoke принимать массив аргументов типа object и сам понимать сколько ему аргументов нужно и какого типа ?


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


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(gpepsi @  2.9.2012,  09:21 Найти цитируемый пост)
Я создаю экземпляры COM. Получается, что мне нужно после создания держать карту
Map<String, Object>, чтоб можно было найти по имени типа нужный COM ?

Давай начнем с того, как ты их создаешь и как вообще работаешь с ком. Обычно для этого генерируется сборка взаимодействия, в которой все типы являются CLR-типами и никакой проблемы рефлексии в этом плане быть не должно. Если ты делаешь это иначе, то опиши как и почему. Поначалу ты вообще написал, что создал собственные оболочки для ком-типов(насколько я понял).
Цитата(gpepsi @  2.9.2012,  09:21 Найти цитируемый пост)
Может ли Invoke принимать массив аргументов типа object и сам понимать сколько ему аргументов нужно и какого типа ?

Инвоук не может, но методинфо(объект, у которого ты вызываешь инвоук) содержит сведения о параметрах.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
gpepsi
Дата 2.9.2012, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(diadiavova @  2.9.2012,  08:36 Найти цитируемый пост)
Давай начнем с того, как ты их создаешь и как вообще работаешь с ком.

я создаю их через Microsoft.VisualBasic.Interaction.CreateObject
получаю интерфейс, и работаю с ним вызывая методы.


Цитата(diadiavova @  2.9.2012,  08:36 Найти цитируемый пост)
Инвоук не может, но методинфо(объект, у которого ты вызываешь инвоук) содержит сведения о параметрах. 

то есть ему можно передать массив аргументов ?
PM MAIL   Вверх
diadiavova
Дата 2.9.2012, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(gpepsi @  2.9.2012,  10:13 Найти цитируемый пост)
я создаю их через Microsoft.VisualBasic.Interaction.CreateObject
получаю интерфейс, и работаю с ним вызывая методы.

Ну вот в этом причина того, что ты не можешь получить сведений о типе. Добавь ссылку на соответствующую библиотеку и все значительно упростится.
Цитата(gpepsi @  2.9.2012,  10:13 Найти цитируемый пост)
то есть ему можно передать массив аргументов ? 

Ну, а что по-твоему представляет из себя второй параметр метода?
http://msdn.microsoft.com/ru-ru/library/a8...8VS.100%29.aspx


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
gpepsi
Дата 2.9.2012, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(diadiavova @  2.9.2012,  09:19 Найти цитируемый пост)
Добавь ссылку на соответствующую библиотеку и все значительно упростится.

а что мне это даст ?
PM MAIL   Вверх
diadiavova
Дата 2.9.2012, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(gpepsi @  2.9.2012,  11:44 Найти цитируемый пост)
а что мне это даст ? 

Как минимум сведения о типах. И вот это
Цитата(gpepsi @  2.9.2012,  09:21 Найти цитируемый пост)
Получается, что мне нужно после создания держать карту
Map<String, Object>, чтоб можно было найти по имени типа нужный COM ?

тебе уже не понадобится.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
gpepsi
Дата 2.9.2012, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(diadiavova @  2.9.2012,  11:09 Найти цитируемый пост)
тебе уже не понадобится. 


diadiavova, я слабоват в C#. Можно подробнее пояснить или примерчик для наглядности
PM MAIL   Вверх
diadiavova
Дата 2.9.2012, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(gpepsi @  2.9.2012,  13:43 Найти цитируемый пост)
 Можно подробнее пояснить 

Добавляешь в проект ссылку на библиотеку, в которой определены нужные ком-классы и все интерфейсы будут доступны как обычные нет типы. Дальше сможешь с помощью рефлексии получить тип по имени в том числе. Добавь ссылку и сам все увидишь.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
gpepsi
Дата 2.9.2012, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(diadiavova @  2.9.2012,  14:56 Найти цитируемый пост)
Дальше сможешь с помощью рефлексии получить тип по имени в том числе.

имеется ввиду создать экземпляр по имени ?
PM MAIL   Вверх
diadiavova
Дата 2.9.2012, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(gpepsi @  2.9.2012,  16:28 Найти цитируемый пост)
имеется ввиду создать экземпляр по имени ?

Аааааааа. Не знаю с какими ком-типами ты работаешь. Для примера возьмем библиотеку Scripting Runtime. (находится по адресу C:\Windows\System32\scrrun.dll). Допустим мне пришло имя FileSystemObject и надо создать экземпляр этого типа. Для начала нам понадобится ссылка на сборку, в которой определены типы. Если ты пишешь под 4-ый фреймворк, то по умолчанию типы внедряются в твою сборку, а это нам не надо. Для того, чтобы сборка взаимодействия создавалась отдельно, в обозревателе решений открой ветку "Ссылки", найди там свою ком-библиотеку(в моем случае она называется Scripting), выдели ее и перейди в окно свойств(или через контекстное меню), там увидишь свойства сборки, тебе надо свойству "Внедрить типы взаимодействия" присвоить False.

В коде сначала надо получить ссылку на сборку взаимодействия, в которой определены нужные типы. Проще всего это сделать, используя какой-нибудь тип, определенный в этой сборке. Я использовал все тот же FileSystemObject, хотя можно было и любой другой, они все имеют ссылку на свою сборку
Код

Assembly asm = typeof(Scripting.FileSystemObject).Assembly;
Теперь имея сборку можно получить объект
Код

object obj = Activator.CreateComInstanceFrom(asm.Location, "Scripting.FileSystemObjectClass").Unwrap();
Как видишь, от сборки нам понадобился только путь к файлу, а к полному имени типа добавился суффикс "Class". Дальше с этим объектом можно работать.

Добавлено через 35 секунд
Не забудь импортировать 
Код

using System.Reflection;



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

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


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

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


 




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


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

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