передача COM-объектов через Remoting
От: Koloto  
Дата: 22.10.04 09:34
Оценка:
Столкнулся со проблемой передачи СОМ-объектов (в частности Excel) через Remoting. Есть клиент и сервер, оба на C#, код полностью управляемый. Добавляю к проектам сервера и клиента ссылку на СОМ-компонент Microsoft Excel 10.0 Object Library. Создаю на клиенте экземпляр Excel.ApplicationClass и пытаюсь передать его (как интерфейс Excel.Application) на сервер. При этом клиент наглухо зависает. Например, код простейшего метода сервера:
public void FillXL(Excel.Application xl)
{
    xl.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
}

код вызова на клиенте:
    Excel.Application xl = new Excel.ApplicationClass();
    xl.Visible = true;
    Server.FillXL(xl);   //Server - это экземпляр Remoting сервера

Показывается новое пустое приложение экселя, затем при вызове метода FillXL клиент виснет намертво, ни на что не отвечая. Даже если клиент и сервер на одной машине. Пробовал передавать параметр как Excel.ApplicationClass и как object с последующим приведением типов — та же ботва. Если Server сделать локальным объектом, естественно, все работает. В чем тут заморочка?
Раньше (на VB6 и VC6) подобную штуку можно было реализовать через OLE или DCOM. Можно ли такое в .NET? Можно ли передавать COM-интерфейсы через Remoting вообще? Может, это какая-нибудь фича Interopa вообще? С Interop только начал работать, так что не пинайте очень сильно, если какую глупость сморозил Буду рад любой помощи.
Re: передача COM-объектов через Remoting
От: Tom Россия http://www.RSDN.ru
Дата: 22.10.04 10:37
Оценка:
А сам вызов в сервер приходит?
Posted via RSDN NNTP Server 1.9 gamma
Народная мудрось
всем все никому ничего(с).
Re[2]: передача COM-объектов через Remoting
От: Koloto  
Дата: 22.10.04 10:45
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>А сам вызов в сервер приходит?


Вызов приходит. Вызовы любых других методов проходят на ура. FillXL в описанной реализации виснет при вызове; если передавать параметр как object, то виснет при попытке конвертации к Excel.Application. Похоже, дело именно в обращении к COM-интерфейсу. Или в его передаче, или конвертации, или еще в чем((
Re: передача COM-объектов через Remoting
От: TK Лес кывт.рф
Дата: 22.10.04 10:59
Оценка:
Hello, "Koloto"
> Столкнулся со проблемой передачи СОМ-объектов (в частности Excel) через Remoting. Есть клиент и сервер, оба на C#, код полностью управляемый. Добавляю к проектам сервера и клиента ссылку на СОМ-компонент Microsoft Excel 10.0 Object Library. Создаю на клиенте экземпляр Excel.ApplicationClass и пытаюсь передать его (как интерфейс Excel.Application) на сервер. При этом клиент наглухо зависает.

Что-то где-то лочится. Запусти оба процесса под отладчиком (Галку Enable Unmanaged Debugging тоже стоит отметить) и когда все зависнет — нажми Break и посмотри стек каждого потока — можно будет определить что, где и на чем конкретно виснет.
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: передача COM-объектов через Remoting
От: Koloto  
Дата: 22.10.04 12:05
Оценка:
Здравствуйте, TK, Вы писали:

TK>Что-то где-то лочится. Запусти оба процесса под отладчиком (Галку Enable Unmanaged Debugging тоже стоит отметить) и когда все зависнет — нажми Break и посмотри стек каждого потока — можно будет определить что, где и на чем конкретно виснет.



Вот вершушка стека вызовов на клиенте в момент зависания:


Вот верхушка стека сервера в функции FillXL до момента конвертации object к Excel.Application:


После подвисания на в стеке серверного процесса только стек запуска ф-ции Main().

Я не очень в этом секу, но судя по стеку на сервере проблема с синхронизацией процессов. Я прав или нет? Если да, то как это лечить?
Re[3]: передача COM-объектов через Remoting
От: EM Великобритания  
Дата: 22.10.04 14:21
Оценка:
Здравствуйте, Koloto, Вы писали:

K>Здравствуйте, TK, Вы писали:


TK>>Что-то где-то лочится. Запусти оба процесса под отладчиком (Галку Enable Unmanaged Debugging тоже стоит отметить) и когда все зависнет — нажми Break и посмотри стек каждого потока — можно будет определить что, где и на чем конкретно виснет.



K>Вот вершушка стека вызовов на клиенте в момент зависания:

K>После подвисания на в стеке серверного процесса только стек запуска ф-ции Main().


Поробуйте убрать оттуда [STAThread]
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[4]: передача COM-объектов через Remoting
От: Koloto  
Дата: 25.10.04 08:56
Оценка:
Здравствуйте, EM, Вы писали:

EM>Поробуйте убрать оттуда [STAThread]


Заработало! Если у клиента убрать атрибут [STAThread] перед Main(), то все работает. Однако, в серверном процессе этот атрибут как ни странно может быть оставлен.
Большое спасибо всем, в особенности ЕМ.
Re[5]: передача COM-объектов через Remoting
От: TK Лес кывт.рф
Дата: 25.10.04 09:27
Оценка:
Hello, "Koloto"
>
> Заработало! Если у клиента убрать атрибут [STAThread] перед Main(), то все работает. Однако, в серверном процессе этот атрибут как ни странно может быть оставлен.

На эту тему писали, что на сервере, если оставить атрибут STAThread, то может поточь память
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[6]: передача COM-объектов через Remoting
От: Koloto  
Дата: 25.10.04 09:38
Оценка:
Здравствуйте, TK, Вы писали:

TK>Hello, "Koloto"

>>
>> Заработало! Если у клиента убрать атрибут [STAThread] перед Main(), то все работает. Однако, в серверном процессе этот атрибут как ни странно может быть оставлен.

TK>На эту тему писали, что на сервере, если оставить атрибут STAThread, то может поточь память


Сенкс, буду знать.
Re[5]: передача COM-объектов через Remoting
От: Tom Россия http://www.RSDN.ru
Дата: 25.10.04 10:07
Оценка:
Здравствуйте, Koloto, Вы писали:

K>Здравствуйте, EM, Вы писали:


EM>>Поробуйте убрать оттуда [STAThread]


K>Заработало! Если у клиента убрать атрибут [STAThread] перед Main(), то все работает. Однако, в серверном процессе этот атрибут как ни странно может быть оставлен.

K>Большое спасибо всем, в особенности ЕМ.

Теперь самое главное — понять почему оно заработало
Мне например непонятно. И ещё проверить бы это на FW 2.0
Народная мудрось
всем все никому ничего(с).
Re[6]: передача COM-объектов через Remoting
От: migel  
Дата: 25.10.04 10:28
Оценка:
Здравствуйте, Tom, Вы писали:
Tom>Теперь самое главное — понять почему оно заработало
Tom>Мне например непонятно. И ещё проверить бы это на FW 2.0
Дык для COM ST апартмента нужен был работающий цикл сообщений,
а при ремотинг вызове .NET его не крутит вот и получается вис.
... << RSDN@Home 1.1.4 beta 3 rev. 196>>
Re[5]: передача COM-объектов через Remoting
От: Koloto  
Дата: 26.10.04 07:51
Оценка:
EM>>Поробуйте убрать оттуда [STAThread]

K>Заработало! Если у клиента убрать атрибут [STAThread] перед Main(), то все работает. Однако, в серверном процессе этот атрибут как ни странно может быть оставлен.

K>Большое спасибо всем, в особенности ЕМ.

Заработало, но на счет "все" я погорячился Использование ActiveX-компонент, а также Drag&Drop требуют STA модели. Это что ж мне теперь для каждой формы с ActiveX создавать отдельный STA-поток? Или наоборот оставить [STAThread] перед Main() и для передачи COM-объектов серверу создавать MTA-потоки? Уж больно криво получается(( И с синхронизацией еще придется мучиться...
Re[7]: передача COM-объектов через Remoting
От: Tom Россия http://www.RSDN.ru
Дата: 26.10.04 08:01
Оценка:
M>Дык для COM ST апартмента нужен был работающий цикл сообщений,
M>а при ремотинг вызове .NET его не крутит вот и получается вис.

Дак а причём тут STA поток и ремотинг?
Вызов ремотинга и COM вообще не должны никаким боком быть связаны....
Народная мудрось
всем все никому ничего(с).
Re[8]: передача COM-объектов через Remoting
От: migel  
Дата: 26.10.04 08:11
Оценка:
Здравствуйте, Tom, Вы писали:

M>>Дык для COM ST апартмента нужен был работающий цикл сообщений,

M>>а при ремотинг вызове .NET его не крутит вот и получается вис.

Tom>Дак а причём тут STA поток и ремотинг?

Tom>Вызов ремотинга и COM вообще не должны никаким боком быть связаны....
А сервер как работает с сылкой COM объекта которую ему заслали?
... << RSDN@Home 1.1.4 beta 3 rev. 196>>
Re[9]: передача COM-объектов через Remoting
От: Tom Россия http://www.RSDN.ru
Дата: 26.10.04 08:29
Оценка:
Tom>>Дак а причём тут STA поток и ремотинг?
Tom>>Вызов ремотинга и COM вообще не должны никаким боком быть связаны....
M>А сервер как работает с сылкой COM объекта которую ему заслали?
Обьект A создаёт COM обьект. Причём создаёт из STA апатрамента
Обьект A создаёт обьект B — находящийся в другом аппдомене и вызывает метод обьекта B, передав COM обьект. COM обьекты передаются в ремотинге не с использованием стандартного механизма COM — маршалинга, а просто как MBR .NET обьекты. Таким образом обьект B имеет ссылку на MBR, которую и вызывает. В теории вызов должен попасть в аппдомаин и апартамент STA обьекта A и оттуда должен быть вызван COM обьект. У автора вопроса же явно ремотинг делает какой то вызов в апартамент обьекта A а так как исходящие вызовы remoting — это не вызовы COM и они не крутят цикл выборки сообщений, то происходит нарушение реентерабельности аппартамента. Вопрос остаётся один. ЗАчем remoting делает вызов COM в апартамент обьекта A. В теории этого не должно быть вообще
Народная мудрось
всем все никому ничего(с).
Re[10]: передача COM-объектов через Remoting
От: migel  
Дата: 26.10.04 09:00
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>У автора вопроса же явно ремотинг делает какой то вызов в апартамент обьекта A а так как исходящие вызовы remoting — это не вызовы COM и они не крутят цикл выборки сообщений, то происходит нарушение реентерабельности аппартамента. Вопрос остаётся один. ЗАчем remoting делает вызов COM в апартамент обьекта A. В теории этого не должно быть вообще

Дык и я том же говорил
Сервер вызывает объект А как родной .НЕТ MBR и о COM вообще по идее знать не должен... вот все вызовы и приходят в изначальный COM STA.
... << RSDN@Home 1.1.4 beta 3 rev. 196>>
Re[11]: передача COM-объектов через Remoting
От: Tom Россия http://www.RSDN.ru
Дата: 26.10.04 09:25
Оценка:
Здравствуйте, migel, Вы писали:

M>Здравствуйте, Tom, Вы писали:


Tom>>У автора вопроса же явно ремотинг делает какой то вызов в апартамент обьекта A а так как исходящие вызовы remoting — это не вызовы COM и они не крутят цикл выборки сообщений, то происходит нарушение реентерабельности аппартамента. Вопрос остаётся один. ЗАчем remoting делает вызов COM в апартамент обьекта A. В теории этого не должно быть вообще

M>Дык и я том же говорил
M>Сервер вызывает объект А как родной .НЕТ MBR и о COM вообще по идее знать не должен... вот все вызовы и приходят в изначальный COM STA.
Ещё раз повторябю, что вызовы не должны приходить нивкакой STA. Вызовы по ремотингу идут между апп доменами. Так что, то, что происходит у автора вопроса — это баг ремотинга, который приводит к нарушению реентерабельности
Народная мудрось
всем все никому ничего(с).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.