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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача делегата через Ремоутинг, требует копию client.exe 
:(
    Опции темы
opozdaika
Дата 15.7.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нужно, чтобы клиетны ремоутигна подписывались на событие сервера. Я вынес в DLL не только объект ремоутигна, но и даже некую фабрику по его производству. И все равно работает только в том случае, если на компьютере-СЕРВЕРЕ я кладу в папку, где лежит server.exe, копию файла client.exe, который там по моему скромному мнению вообще не нужен. Да еще и ругается, зараза, если копия client.exe не совсем свежая. 

Если я не положу копию клиентского exe, то работает все следущим образом. Запускаю на компьютере-сервере server.exe, на комепьютере-клиенте client.exe. Пока не подписываю клиента на событие. Они работают нормально, т.е. я могу на клиенте вызывать функции удаленного объекта, сервер на эти вызовы реагирует. Затем я произвожу на клиенте подписку на событие:

Код

RemotingObject.RemotingEvent += new RemotingEventDelegate(MyHandler);
где RemotingObject - объект ремоутигна;
RemotingEvent - поле event;
RemotingEventDelegate - делегат такого же типа, что и RemotingEvent;
MyHandler() - функция-обработчик события, реализованная внутри кода client.exe

В этот момент на компьюрере-КЛИЕНТЕ появляется окно ошибки, произошедшей на СЕРВЕРЕ. Текст в окне такой (RemotingClient -это фактическое имя моего клиентского exe): 

Цитата

System.Reflection.TargetInvocationException: Адресат вызова создал исключение. ---> System.IO.FileNotFoundException: Невозможно загрузить файл или сборку "RemotingClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" или один из зависимых от них компонентов. Не удается найти указанный файл.
File name: 'RemotingClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
в System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
в System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
в System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
и т.д.
Если положить копию client.exe под бок к server.exe, то все работает.

Да, я согласен, что функция-обработчик реализована у меня в client.exe Ну и что с этого? Зачем же server.exe лезет загружать копию сборкуи client.exe - ведь это всего лишь копия, которая не в работе. Истинный client.exe в это время работает на другом компьютере! Это что, такой "свадебный генерал" получается, которого я должен держать на сервере чисто для мебели?

Короче, вопрос: как избавиться от неоходимости держать копию клиентского exe на стороне сервера при реализации подписки на собыдия сервера при ремоутинге?
Спасибо.  

PM MAIL   Вверх
mihryak
Дата 16.7.2009, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вынеси все общие для клиента-сервера типы в отдельную сборку и добавь на неё и там, и там референсы
у тебя же, судя по всему, сервер референсит клиента
PM MAIL ICQ   Вверх
QryStaL
Дата 17.7.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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



opozdaika, это классическая проблема при работе с делегатами через Remoting. Проблема в том, что на стороне сервера должна быть сборка с классом, на метод которого ссылается экземпляр делегата.

Цитата(opozdaika @  15.7.2009,  13:30 Найти цитируемый пост)
Зачем же server.exe лезет загружать копию сборкуи client.exe - ведь это всего лишь копия, которая не в работе.

Для того, чтобы корректно десериализовать делегат на той стороне.

Цитата(opozdaika @  15.7.2009,  13:30 Найти цитируемый пост)
Короче, вопрос: как избавиться от неоходимости держать копию клиентского exe на стороне сервера при реализации подписки на собыдия сервера при ремоутинге?

Advanced .NET Remoting, Second Edition
p. 213 Remoting Events

Если вкратце:
Instead, you can introduce an intermediate MarshalByRefObject (including the implementation,
not only the interface) that will be located in General.dll and will therefore be accessible
by both client and server.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




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


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

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