Проблема загадочного характера.
COM сервер реализованный как DLL (С++) регистрируется на cервере. Для проверки пробую OleView->CreateInstance создаю его удаленно и локально все гуд. Пытаюсь вызвать с .Net клиента получаю, что на удаленном сервере класс не зарегистрирован. Собственно код вызова:
string server = "remotehost";
Type type = Type.GetTypeFromCLSID(typeof(ObjClass).GUID, server);
IObjClass link = (IObjClass)Activator.CreateInstance(type);
link.Run(tbxTest.Text);
Целый день пытался найти, что может быть не так ... Может кто наступал на такую граблю.
Здравствуйте, _Cancel, Вы писали:
_C>Проблема загадочного характера.
_C>COM сервер реализованный как DLL (С++) регистрируется на cервере. Для проверки пробую OleView->CreateInstance создаю его удаленно и локально все гуд. Пытаюсь вызвать с .Net клиента получаю, что на удаленном сервере класс не зарегистрирован. Собственно код вызова:
_C>_C>string server = "remotehost";
_C>Type type = Type.GetTypeFromCLSID(typeof(ObjClass).GUID, server);
_C>IObjClass link = (IObjClass)Activator.CreateInstance(type);
_C>link.Run(tbxTest.Text);
_C>
_C>Целый день пытался найти, что может быть не так ... Может кто наступал на такую граблю.
По моему,так как вы делаете,нельзя. Что бы подключится к COM серверу следует знать его прокрамный идентификатор(вы его должны знать). Далее в таком вот духе:string ServName = ProgIDserver;
Type TypeOfServer = Type.GetTypeFromProgID(ProgIDserver);
if (TypeOfServer == null)
Marshal.ThrowExceptionForHR( HRESULTS.OPC_E_NOTFOUND );
object ServerObj = Activator.CreateInstance(TypeOfServer);
iServer = (IServer) OPCServerObj;
Здравствуйте, Phaust, Вы писали:
P>По моему,так как вы делаете,нельзя. Что бы подключится к COM серверу следует знать его прокрамный идентификатор(вы его должны знать). Далее в таком вот духе:string ServName = ProgIDserver;
P>Type TypeOfServer = Type.GetTypeFromProgID(ProgIDserver);
P>if (TypeOfServer == null)
P>Marshal.ThrowExceptionForHR( HRESULTS.OPC_E_NOTFOUND );
P>object ServerObj = Activator.CreateInstance(TypeOfServer);
P>iServer = (IServer) OPCServerObj;
P>
а разницы по CLSID или по ProgID определять тип объекта. Естественно пробовал не работает. Я так понимаю, что удаленный COM-сервер, в DLL может быть реализован только для COM+, а так только EXE, ему ведь нужен процесс, чтоб кудато эту библиотеку загрузить. В COM+ это dllhost.exe.
Здравствуйте, Phaust, Вы писали:
P>По моему,так как вы делаете,нельзя. Что бы подключится к COM серверу следует знать его прокрамный идентификатор(вы его должны знать). Далее в таком вот духе:string ServName = ProgIDserver;
P>Type TypeOfServer = Type.GetTypeFromProgID(ProgIDserver);
P>if (TypeOfServer == null)
P>Marshal.ThrowExceptionForHR( HRESULTS.OPC_E_NOTFOUND );
P>object ServerObj = Activator.CreateInstance(TypeOfServer);
P>iServer = (IServer) OPCServerObj;
P>
В догонку Type он кстати получает...
Здравствуйте, _Cancel, Вы писали:
_C>Я так понимаю, что удаленный COM-сервер, в DLL может быть реализован только для COM+, а так только EXE, ему ведь нужен процесс, чтоб кудато эту библиотеку загрузить.
вы путаете теплое с мягким. Удаленный COM сервер в виде DLL это на самом DCOM inproc server. Можете почитать хоть здесь:
http://www.allinterview.com/showanswers/16127.html http://www.osp.ru/win2000/2001/03/174740/
Здравствуйте, Phaust, Вы писали:
P>Здравствуйте, _Cancel, Вы писали:
_C>>Я так понимаю, что удаленный COM-сервер, в DLL может быть реализован только для COM+, а так только EXE, ему ведь нужен процесс, чтоб кудато эту библиотеку загрузить.
P>вы путаете теплое с мягким. Удаленный COM сервер в виде DLL это на самом DCOM inproc server. Можете почитать хоть здесь: http://www.allinterview.com/showanswers/16127.html http://www.osp.ru/win2000/2001/03/174740/
Спасибо, честно говоря не знал. Тогда совсем не могу понять, почему получаю ошибку класс не зарегистрирован...