Здравствуйте, <Аноним>, Вы писали:
А>Привет всем. Я только начал изучать .NET Remoting. Есть приложение-сервер и приложение-клиент. Конфигурационный файл сервера
[skipped] А>Вроде все нормально, вызов функции RemotingConfiguration.Configure в клиенте происходит нормально. Проблема следующая. При вызхове следующей строки
А>
А> m_IJobServer.JobEvent += new JobEventHandler(this.MyJobEventHandler);
А>
А>возникает эксептион — Cannot load file or assembly JobClient.exe bla bla bla. Вопрос — че за нафиг, и вообще связано ли это с .NET Remoting?
Да, связано... чтобы подписаться на обработку делегата, надо чтобы на сервере был тип, который подписывается.
Как вариант — сделать ProxyClass (не путать с XXXProxy из .Net Framework) примерно так:
public class EventProxy
{
public void Event(object sender, EventArgs e)
{
if (RealEvent != null)
RealEvent(sender, e);
}
public event EventHandler RealEvent;
}
Описать этот класс в серверной сборке и подписывать его метод на события (на клиенте, естессно) и на клиенте же подписаться на его события... примерно так:
public void ClientEventSubscription()
{
EventProxy proxy = new EventProxy();
serverObject.Event += new EventHandler(proxy.Event);
proxy.RealEvent += new EventHandler(MyEventHandler);
}
тогда все запашет...
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: .NET Remoting
От:
Аноним
Дата:
28.02.06 13:10
Оценка:
Большое спасибо, все заработало, но не до конца. Скажи пожалйста, какой раздел в MSDN описывает данную проблему, чтобы мне самому понять в чем дело.
Здравствуйте, Аноним, Вы писали:
А>Большое спасибо, все заработало, но не до конца. Скажи пожалйста, какой раздел в MSDN описывает данную проблему, чтобы мне самому понять в чем дело.
Здравствуйте, <Аноним>, Вы писали:
А>Большое спасибо, все заработало, но не до конца. Скажи пожалйста, какой раздел в MSDN описывает данную проблему, чтобы мне самому понять в чем дело.
да нет такого раздела специального — надо просто понимать, что для того, чтобы вызвать метод (а что есть делегат, как не скрытый вызов метода) надо чтобы объект был на сервере.
P.S.
кстати, заьыл указать в том исходнике, что нужно наследоваться от MarshalByRefObject...
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>кстати, заьыл указать в том исходнике, что нужно наследоваться от MarshalByRefObject...
И еще переопределить InitializeLifeTimeService
---
Если ты хочешь рассмешить Бога — расскажи ему свои планы на будущее
Re[2]: .NET Remoting
От:
Аноним
Дата:
01.03.06 09:33
Оценка:
Большое спасибо всем, ща приложение нормально запускается, функуии серверного объекта вызываются, тока чтото при генерации события на сервере оно не доходит до клиента.
События подключаются как написано выше:
// event connecting
m_IJobServer.JobEvent += new JobEventHandler(proxy.Event);
proxy.RealJobEvent += new JobEventHandler(MyJobEventHandler);
Класс JobEventProxy:
public class JobEventProxy : MarshalByRefObject
{
public event JobEventHandler RealJobEvent;
public void Event(object sender, JobEventArgs args)
{
if (RealJobEvent != null)
RealJobEvent(sender, args);
}
public override object InitializeLifetimeService()
{
return null;
}
}
Ну и наконец функция серверного объекта, которая генерит событие:
поставь вместо BeginInvoke просто Invoke — сразу узнаешь что не так...
попробуй на клиенте добавить вот такой код до инициализации:
Hashtable props = new Hashtable();
props.Add("port", 0);
//тут serverSinkProvider с TypeFilterLevel.Full инициализируется.
TcpChannel channel = new TcpChannel(props, serverSinkProvider, null);
channel.StartListen(0);
ChannelServices.RegisterChannel(channel);
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[4]: .NET Remoting
От:
Аноним
Дата:
01.03.06 10:50
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Здравствуйте, <Аноним>, Вы писали:
H_D>поставь вместо BeginInvoke просто Invoke — сразу узнаешь что не так... H_D>попробуй на клиенте добавить вот такой код до инициализации: H_D>
H_D>//тут serverSinkProvider с TypeFilterLevel.Full инициализируется.
H_D>TcpChannel channel = new TcpChannel(props, serverSinkProvider, null);
H_D>channel.StartListen(0);
H_D>ChannelServices.RegisterChannel(channel);
H_D>
Мне чето непонятно, почему serverSinkProvider и серверный канал надо инициализировать на стороне клиента?
А>Мне чето непонятно, почему serverSinkProvider и серверный канал надо инициализировать на стороне клиента?
потому, что при вызове делегатов клиент становится сервером и наоборот...
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Спасибо за советы, надеюсь я еще не достал)). Добавил все как написано выще, но происходит следующее:
1. Если оставить handler.BeginInvoke(...), то по-прежнему события не доходят до клиента.
2. Если же поставить просто handler.Invoke(...), то на этом вызове программа тихо умирает, без каких-либо опознавательных знаков ((.
Теперь мне погятно, что мне надо клиент наследовать от MarshallByRefObj, только студия не дает наследовать оконный класс от MarshallByrefObj. Возможно ли вообзе такое? или мне надо написать новый класс для клиента, который будет существоавть отдельно от оконного класса?
Ну множественное наследование в .NET не поддерживается, поэтому это не получится. Конечно, лучше создать отдельный класс и не смешивать интерфейс с логикой приложения.