На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> .Net Remoting + COM клиент , Ошибка работы с удаленным интерфейсом
    Есть тестовое клиент-серверное приложение на .Net с использованием Remoting. В сервере ничего заковыристого, просто класс с реализацией интерфейса, объявленного в отдельной сборке как

    ExpandedWrap disabled
          [ComVisible(true)]
          [Guid("3E30C861-5CE3-49b2-9633-88EFD16259E6")]
          public interface ISrv
          {
              void GetAppName([Out, MarshalAs(UnmanagedType.LPWStr)]out string _Result);
          }


    Клиентская библиотека на .Net предоставляет доступ к удаленному интерфейсу для .Net клиента, а также COM-клиентам через свой клиентский интерфейс ICOMProxy:

    ExpandedWrap disabled
          [ComVisible(true)]
          [Guid("72E58B9C-19BC-48fd-AD2B-144A0C4F6ADE")]
          public interface ICOMProxy
          {
              ISrv GetServer();
              string GetServerMethod();
          }
          
          [ComVisible(true)]
          public class TComProxy : ICOMProxy
          {
              ISrv FSrv;
              public ISrv GetServer()
              {
                  return FSrv;
              }
              public string GetServerMethod()
              {
                  string Result;
                  FSrv.GetAppName(out Result);
                  return Result;
              }
              public TComProxy()
              {
                  
                  // экземпляр клиентского TCP-канала
                  TcpClientChannel aTCPch = new TcpClientChannel();
                  // регистрируется в ремотинг системе
                  ChannelServices.RegisterChannel(aTCPch, false);
                  // создание сервака
                  FSrv = (ISrv)Activator.GetObject(typeof(ISrv), "tcp://localhost:8005/TestSrv");
              }
          }


    Так вот, работа с ICOMProxy через .Net клиентами нареканий не вызывает, а вот при взаимодейстии через COM начинаются проблемы.
    Вот код Delphi 5:

    ExpandedWrap disabled
      procedure TForm1.btn2Click(Sender: TObject);
      var
        IProxy: ICOMProxy;
        IServer: ISrv;
      begin
        IProxy := CreateComObject(CLASS_TComProxy) as ICOMProxy;
        ShowMessage(IProxy.GetServerMethod);
        IServer := IProxy.GetServer;
        ...
      end;


    Так вот, ShowMessage(IProxy.GetServerMethod) отрабатывает без проблем, что говорит о нормальном взаимодействии вызываемого клиента .Net с сервером.
    А вот строчка IProxy.GetServer вызывает исключение E_NOINTERFACE.

    Попробовал получать из COM ссылку на вложенный произвольный интерфейс локального .Net объекта клиентской библиотеки. Работает.
    Очевидно, делегат интерфейса сервера, представленный переменной FSrv, не предоставляет COM-вызову требуемого интерфейса. Как лечить?
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0250 ]   [ 16 queries used ]   [ Generated: 25.04.24, 14:50 GMT ]