Я пытаюсь получить доступ к объектам C # из другого процесса, чем тот, в котором они находятся, через COM. Объекты C # доступны для COM.
Проблема в том, что когда я вызываю метод для этих объектов, вызовы выполняются локально, а не на COM-сервере outproc, где я хочу, чтобы возникали побочные эффекты этих вызовов.
Точнее, вот что я делаю, пытаясь получить доступ к объектам, находящимся на COM-сервере outproc:
Type oType = Type.GetTypeFromProgID("myProgId");
var obj = Activator.CreateInstance(oType);
var result = oType.InvokeMember("GetObjForMyClassMethod",
BindingFlags.InvokeMethod, null, obj, null);
Затем я передаю результат в соответствующий интерфейс (IMyInterface
) класса C #, и когда я вызываю методы этого интерфейса, они выполняются удаленно на COM-сервере outproc, как я и ожидал.
Проблема начинается, когда я использую этот интерфейс для получения других объектов C # (я использую метод IMyInterface.GetOtherObject()
, который возвращает IOtherObjectInterface
).
Когда я вызываю IOtherObjectInterface
, они выполняются локально, а не на COM-сервере outproc, поэтому их побочные эффекты теряются (например, если я вызываю метод SetValue, значение не поступает на сервер outproc и теряется).
Более того, когда я смотрю в отладчик во время выполнения, я вижу, что тип интерфейса, для которого работают удаленные вызовы, равен System._ComObject
, тогда как тип интерфейса, в котором удаленные вызовы не работают, является фактическим типом (IOtherObjectInterface
).
Я попытался реплицировать все (все атрибуты и другие реализованные интерфейсы) о том, как IMyInterface
(тот, для которого работают удаленные вызовы) отображается в COM на IOtherObjectInterface
(тот, для которого удаленные вызовы не работают), но не повезло .
Что нужно сделать, чтобы вызовы, которые я делаю на IOtherObjectInterface
, выполнялись на сервере outproc через RPC, а не в локальном процессе (тот, где отправляются вызовы), где они никому не нужны?
ИЗМЕНИТЬ:
С тех пор я обнаружил, что если я извлекаю объект, для которого он не работает (IOtherObjectInterface
), используя тот же метод, который я использую для объекта, для которого он работает (oType.InvokeMember ("GetOtherObjForMyClassMethod", ....), он по-прежнему не работает (вызовы, которые я делаю для объекта, все еще не перенаправляются на COM-сервер outproc).
Таким образом, проблема связана с самим классом, а не с методом, используемым для получения объектов.
Я сильно подозреваю, что эта проблема как-то связана с сериализацией, хотя оба класса (работающие и не работающие), похоже, реализуют сериализацию одинаково ...
РЕДАКТИРОВАТЬ2:
Я не понимаю, что класс, для которого работает это «удаленное взаимодействие с COM» (тот, для которого я получаю System._ComObject, когда я получаю объект вне COM-сервера) имеет атрибут «сериализуемый». Я думал, что по умолчанию для типов с этим атрибутом используется сортировка по значению.
I thought the default for types with this attribute was marshal-by-value.
- Да, но вы не маршалируете этот экземпляр (он находится в процессе сервера OOP COM), вы разговариваете с его__ComObject
прокси, созданным CLR. - person Chris Dickson   schedule 14.09.2012