Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.115.195] |
|
Сообщ.
#1
,
|
|
|
Есть тестовое клиент-серверное приложение на .Net с использованием Remoting. В сервере ничего заковыристого, просто класс с реализацией интерфейса, объявленного в отдельной сборке как
[ComVisible(true)] [Guid("3E30C861-5CE3-49b2-9633-88EFD16259E6")] public interface ISrv { void GetAppName([Out, MarshalAs(UnmanagedType.LPWStr)]out string _Result); } Клиентская библиотека на .Net предоставляет доступ к удаленному интерфейсу для .Net клиента, а также COM-клиентам через свой клиентский интерфейс ICOMProxy: [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: 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-вызову требуемого интерфейса. Как лечить? |