Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.135.224] |
|
Сообщ.
#1
,
|
|
|
Ещё вопрос про подписывание клиентов на события сервера через делегаты, сделал так вот:
Общая библиотека: сразу вопрос нужно ли делегат сереализовать? public interface IServer { event EmptyEventHandler Empty; } public delegate void EmptyEventHandler (); Сервер: internal static class Program { internal static void Main () { Server.Start (); Console.ReadKey (); } } public class Server : MarshalByRefObject, IServer { public static void Start () { RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off; BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider (); provider.TypeFilterLevel = TypeFilterLevel.Full; IDictionary props = new Hashtable (); props["port"] = 12345; TcpChannel channel = new TcpChannel (props, null, provider); ChannelServices.RegisterChannel (channel, false); RemotingConfiguration.RegisterWellKnownServiceType (typeof (Server), "Server", WellKnownObjectMode.Singleton); } public event EmptyEventHandler Empty; } Клиент: internal static class Program { internal static void Main () { BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider (); provider.TypeFilterLevel = TypeFilterLevel.Full; IDictionary props = new Hashtable (); props["port"] = 0; TcpChannel channel = new TcpChannel (props, new BinaryClientFormatterSinkProvider (), provider); ChannelServices.RegisterChannel (channel, false); IServer server = (IServer)Activator.GetObject (typeof (IServer), "tcp://localhost:12345/Server"); MyMarshalClass temp = new MyMarshalClass (); server.Empty += new EmptyEventHandler (new EmptyEventHandler (temp.Function)); Console.ReadKey (); } } public class MyMarshalClass : MarshalByRefObject { public void Function () { } } При запуске, клиент строке server.Empty += new EmptyEventHandler (new EmptyEventHandler (temp.Function)); ругается исключением: Exception has been thrown by the target of an invocation. Если я помещаю класс MyMarshalClass в библиотеку тогда исключение пропадает, но не таскать же подписываемый клиентский класс в лайбрари, чё я опять упустил? |
Сообщ.
#2
,
|
|
|
TerraGhost, не будут работать event'ы через ремоутинг (предлагаю на досуге подумать, почему).
В качестве решения предлагаю юзать некий класс, наследующийся от MarshalByRefObject, методы которого будет дергать сервер, вместо того, чтобы рейзить евент. |
Сообщ.
#3
,
|
|
|
Можно поинтересоваться почему они у вас не работают, а у меня работают, как я уже написал при реализации в общей библиотеки клиента, что меня и интересует, как от этой реализации избавица
|
Сообщ.
#4
,
|
|
|
Цитата TerraGhost @ как я уже написал при реализации в общей библиотеки клиента, что меня и интересует, как от этой реализации избавица Клиент принимающий события от удаленных объектов, должен иметь доступ к метаданным, описывающим эти объекты. Кроме того, объекты должны иметь методанные описывающие клиент - хотя бы те компоненты, что содержат методы обратного вызова. Поэтому сборка с твоим MyMarshalClass необходима серверу. И таскать ее прийдеться. |
Сообщ.
#5
,
|
|
|
Гм, всё равно не до конца понял, почем у я вместо MyMarshalClass, не могу таскать хотя бы интерфейс с описанием методов класса
|
Сообщ.
#6
,
|
|
|
Цитата J0ker @ TerraGhost, не будут работать event'ы через ремоутинг (предлагаю на досуге подумать, почему). События в Remoting многим разработчикам не нравятся, тем не менее их никто не отменял Для их использования необходимо: P.S. Предлагаю в гугле набрать Remoting events Добавлено Цитата TerraGhost @ Гм, всё равно не до конца понял, почем у я вместо MyMarshalClass, не могу таскать хотя бы интерфейс с описанием методов класса Попробуй. Главное, что ты понял что без сборки не обойтись. Объяви интерфейс. Создавай объект с помощью Activator.GetObject и должно работать. |