COM経由で存在するプロセスとは別のプロセスからC#オブジェクトにアクセスしようとしています。C#オブジェクトはCOMに公開されます。
問題は、これらのオブジェクトでメソッドを呼び出すと、これらの呼び出しの副作用を発生させたいoutproc COMサーバーではなく、ローカルで呼び出しが実行されることです。
より正確には、outprocCOMサーバーにあるオブジェクトにアクセスしようとするプロセスで私が行うことは次のとおりです。
Type oType = Type.GetTypeFromProgID("myProgId");
var obj = Activator.CreateInstance(oType);
var result = oType.InvokeMember("GetObjForMyClassMethod",
BindingFlags.InvokeMethod, null, obj, null);
次に、結果をIMyInterface
C#クラスの適切なインターフェイス()にキャストし、そのインターフェイスのメソッドを呼び出すと、期待どおりにoutprocCOMサーバーでリモートで実行されます。
このインターフェイスを使用して他のC#オブジェクトを取得すると、問題が発生します(をIMyInterface.GetOtherObject()
返すメソッドを使用しますIOtherObjectInterface
)。
で呼び出しを行うとIOtherObjectInterface
、outproc COMサーバーではなくローカルで実行されるため、副作用が失われます(たとえば、SetValueメソッドを呼び出すと、値がoutprocサーバーに到着せず、失われます)。
さらに、実行時にデバッガーを確認すると、リモート呼び出しが機能System._ComObject
するインターフェイスのタイプが実際のタイプ(IOtherObjectInterface
)であるのに対し、リモート呼び出しが機能しないインターフェイスのタイプは実際のタイプであることがわかります。
私はIMyInterface
(リモート呼び出しが機能するもの)がCOMに公開される方法(IOtherObjectInterface
リモート呼び出しが機能しないもの)についてすべて(実装されているすべての属性と他のインターフェイス)を複製しようとしましたが、運がありません。
私が行うIOtherObjectInterface
呼び出しが、誰にも使用されないローカルプロセス(呼び出しが発行されるプロセス)ではなく、RPCを介してoutprocサーバーで実行されるようにするにはどうすればよいですか?
編集:
それ以来、機能しないオブジェクト(IOtherObjectInterface
)を、機能するオブジェクトに使用するのと同じメソッド(oType.InvokeMember( "GetOtherObjForMyClassMethod"、....))を使用して取得した場合でも、それが機能することがわかりました。動作しません(オブジェクトに対して行った呼び出しは、まだoutproc COMサーバーに転送されません)。
したがって、問題はクラス自体にあり、オブジェクトの取得に使用されるメソッドにはありません。
両方のクラス(機能しているクラスと機能していないクラス)が同じ方法でシリアル化を実装しているように見えても、この問題は何らかの形でシリアル化に関連していると強く思います...
EDIT2:
私が得られない部分は、この「COMリモーティング」が機能するクラス(COMサーバーの外部でオブジェクトを取得するときにSystem._ComObjectを取得するクラス)が属性「serializable」を持っているという事実です。この属性を持つタイプのデフォルトは、値によるマーシャルだと思いました。