Я пытаюсь получить доступ к объектам C# из другого процесса, кроме того, где они находятся через COM. Объекты C# подвергаются воздействию COM.Доступ к объекту C# в outproc COM-сервере из другого процесса на том же компьютере
Проблема заключается в том, что при вызове метода на этих объектах вызовы выполняются локально, а не на COM-сервере outproc, где мне нужны побочные эффекты этих вызовов.
Более точно, вот что я делаю в процессе пытается получить доступ к объектам, проживающим в OutProc COM-сервер:
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, а не в локальном (то есть, где вызывают вызовы), где они никому не нужны?
EDIT:
С тех пор я узнал, что, если я получить объект, для которого он не работает (IOtherObjectInterface
), используя тот же метод, который я использую для объекта, для которого он работает (oType. InvokeMember («GetOtherObjForMyClassMethod», ....) он по-прежнему не работает (вызовы, которые я делаю на объекте, по-прежнему не перенаправляются на COM-сервер outproc).
Таким образом, проблема заключается в самом классе, а не метод, используемый для извлечения объектов.
Я сильно с uspect, что эта проблема как-то связана с сериализации, хотя оба класса (работает и не работает), кажется, реализовать сериализацию точно так же ...
EDIT2:
Часть я не получаю это факт, что класс, для которого работает этот «COM-удаленный» (тот, для которого я получаю System._ComObject при извлечении объекта за пределами COM-сервера) имеет атрибут «serializable». Я думал, что значение по умолчанию для типов с этим атрибутом было маршалом по значению.
Примечание: Я выяснил, что это не вопрос DCOM, процессы выполняются на одной машине. –
'Я думал, что по умолчанию для типов с этим атрибутом был маршал по значению.' - Да, но вы не маршалируете этот экземпляр (он живет в процессе COM-сервера OOP), вы говорите с его прокси-сервером '__ComObject' по CLR. –