На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Ремоутинг-2 , ^^
    Ещё вопрос про подписывание клиентов на события сервера через делегаты, сделал так вот:

    Общая библиотека:
    сразу вопрос нужно ли делегат сереализовать?

    ExpandedWrap disabled
          public interface IServer
          {
              event EmptyEventHandler Empty;
          }
       
          public delegate void EmptyEventHandler ();


    Сервер:

    ExpandedWrap disabled
          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;
          }


    Клиент:

    ExpandedWrap disabled
      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 ()
              {
       
              }
          }


    При запуске, клиент строке

    ExpandedWrap disabled
      server.Empty += new EmptyEventHandler (new EmptyEventHandler (temp.Function));


    ругается исключением: Exception has been thrown by the target of an invocation.

    Если я помещаю класс MyMarshalClass в библиотеку тогда исключение пропадает, но не таскать же подписываемый клиентский класс в лайбрари, чё я опять упустил?
    Сообщение отредактировано: TerraGhost -
      TerraGhost, не будут работать event'ы через ремоутинг (предлагаю на досуге подумать, почему).
      В качестве решения предлагаю юзать некий класс, наследующийся от MarshalByRefObject, методы которого будет дергать сервер, вместо того, чтобы рейзить евент.
        Можно поинтересоваться почему они у вас не работают, а у меня работают, как я уже написал при реализации в общей библиотеки клиента, что меня и интересует, как от этой реализации избавица
          Цитата TerraGhost @
          как я уже написал при реализации в общей библиотеки клиента, что меня и интересует, как от этой реализации избавица

          Клиент принимающий события от удаленных объектов, должен иметь доступ к метаданным, описывающим эти объекты. Кроме того, объекты должны иметь методанные описывающие клиент - хотя бы те компоненты, что содержат методы обратного вызова. Поэтому сборка с твоим MyMarshalClass необходима серверу. И таскать ее прийдеться.
          Сообщение отредактировано: juice -
            Гм, всё равно не до конца понял, почем у я вместо MyMarshalClass, не могу таскать хотя бы интерфейс с описанием методов класса
              Цитата J0ker @
              TerraGhost, не будут работать event'ы через ремоутинг (предлагаю на досуге подумать, почему).

              События в Remoting многим разработчикам не нравятся, тем не менее их никто не отменял Для их использования необходимо:
              • 1. Должен быть объявлен делегат, по которому клиент реализует обработчик
              • 2. Аргументы передаваемые клиенту с функцией обработчиком должны быть маршализируемыми
              • 3. Сервер должен объяить евент основанный на делегате
              • 4. Клиент должен создать объект приемника с методом обработчика (в примере это: MyMarshalClass )

              P.S. Предлагаю в гугле набрать Remoting events

              Добавлено
              Цитата TerraGhost @
              Гм, всё равно не до конца понял, почем у я вместо MyMarshalClass, не могу таскать хотя бы интерфейс с описанием методов класса

              Попробуй. Главное, что ты понял что без сборки не обойтись.:) Объяви интерфейс. Создавай объект с помощью Activator.GetObject и должно работать.
              Сообщение отредактировано: juice -
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0780 ]   [ 17 queries used ]   [ Generated: 25.04.24, 10:29 GMT ]