あなたが望むのは、クライアントから見えるインスタンスをServiceConsoleHandler
介してインスタンスにアクセスすることです。RemoteObject
このためには、2 つのことを考慮する必要があります。(1)RemoteObject
インスタンスのオブジェクト構成を制御してアクセスできるようにすることと、(2)ServiceConsoleHandler
リモートからアクセスできるように変更することです。
(1)
リモート処理を考慮する必要がない場合、どのように でRemoteObject
インスタンスを構築しますか?ServiceConsoleHandler
私はあなたがこのようなことをすると思います:
class ServiceConsoleHandler
{
…
RemoteObject remoteObject = new RemoteObject();
// now assume that you also already have
// modified the RemoteObject class so it can hold
// a reference to your server:
remoteObject.Server = this;
…
}
クライアントがこのオブジェクトにアクセスできるようにするとよいでしょう。これを行うには、RemotingConfiguration.RegisterWellKnownServiceType の代わりに RemotingServices.Marshal を使用します。
class ServiceConsoleHandler
{
…
TcpServerChannel channel = new TcpServerChannel(9090);
ChannelServices.RegisterChannel(channel, true);
RemoteObject remoteObject = new RemoteObject();
remoteObject.Server = this;
RemotingServices.Marshal(remoteObject, "RemoteObject.rem");
…
}
(2)
今すぐコードを実行してクライアント コード内の にアクセスすると、クラスにリモートでアクセスできないremoteObject.Server
ため、何らかのリモート例外が発生します。したがって、属性ServiceConsoleHandler
を追加する必要があります。[Serializable]
[Serializable]
class ServiceConsoleHandler
{ … }
理由: リモートでアクセスする必要がある型は、特別な転送可能な表現にマーシャリングする必要があります。このようにして、TCP ポートを介してスクイーズし、TCP プロトコルを介して転送できます。基本的なデータ型はフレームワークによってマーシャリングできるため、それらについて考える必要はありません。カスタムタイプについては、これを行う方法を述べる必要があります。これを行う 1 つの方法は、からサブクラス化することMarshalByRefObject
です。それはまさにあなたがすでに行ったことですRemoteObject
。もう 1 つの方法は、[Serializable]
上記のようにカスタム クラスをマークすることです。
それでおしまい。これで、クライアント コードでサーバーのフィールドにアクセスできるようになります。オブジェクトのアクティブ化に既存のコードは必要ないことに注意してください。
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, true);
RemoteObject remoteObject = (RemoteObject)Activator.GetObject(
typeof(RemoteObject), "tcp://localhost:9090/RemoteObject.rem");
Console.WriteLine(remoteObject.Server.SomethingMore);
私にとって、.NET リモーティングは面白い驚きと眠れぬ夜でいっぱいです。これに対抗するには、リモーティングの概念に慣れてください (私の見解では、これは十分に文書化されていません)。シリアル化の概念 ( MarshalByRefObject
vs. [Serializable]
) を掘り下げます。それから製品コードを作成したい場合は、リモート処理の例外を処理するための非常に良い方法を考えてください。マルチスレッドも考慮してください。一度に複数のクライアントがこのリモート オブジェクトを使用する可能性があります。
楽しむ!