- 題名: 双方向プロセス間通信の実現方法
- 日時: 2011/08/17 13:43:09
- ID: 28898
- この記事の返信元:
- (なし)
- この記事への返信:
- [28903] Re[1]: 双方向プロセス間通信の実現方法2011/08/17 23:08:31
- ツリーを表示
Azuleanさん、今回もお世話になります。 > ・http://msdn.microsoft.com/ja-jp/library/5dxse167.aspx Low から Full に このページを見てプログラムによる逆シリアル化レベルの設定を試みていますが、 サンプルはTcpChannel、こちらはIpcServerChannel(サーバー側)という違いのためか うまくいきません。 ' Creating a custom formatter for your TcpChannel sink chain. Dim provider As New BinaryServerFormatterSinkProvider() provider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full ' Creating the IDictionary to set the port on the channel instance. Dim props As IDictionary = New Hashtable() props("processtrancetest") = 8085 ' Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.) 'IPC Channel を作成 Dim servChannel As IpcServerChannel = New IpcServerChannel(props, provider, Nothing) とやると最終行で 「IPC Server Channel をインスタンス化する場合、ポート名を指定する必要があります。」 というエラーが出ます。 .netのRemoting自体の理解不十分なのですが、セキュリティ上問題があるのでリモートオブジェクトについてはクライアント側から サーバー側にイベントを介してパラメータを送信できるが、逆はデフォルトでは禁止されている。 しかし、セキュリティレベルを変えることでそれも可能となるということでしょうか。 ■No28903に返信(Azuleanさんの記事) > できるかどうかは試していません。 > > ・http://msdn.microsoft.com/ja-jp/library/5dxse167.aspx Low から Full にすることで変わるかどうか。 > ・イベントハンドラは MarshalByRef から派生したクラスに存在しているか?
Azuleanさん、コメントありがとうございます。 ご指摘のようにMSDN読んだり、検索したりして調べる努力が必要なのは理解しているつもりです。 ただ、この分野について全くの初心者で読んでみるのですが、リモーティングに ついては意味の分からない用語が多く(例えばシンクやプロバイダー)、なかなか 理解が進みません。 MSDNは概念やクラスの役割を理解していてコーディングの際にパラメータ確認 などで参照するには十分なのですが、チュートリアル的な説明が非常にわかりにくいです。 No.28906の投稿の下部質問とも関連するのですが、リモートオブジェクト が一方向にしか使えないならもうひとつ別のリモートオブジェクトを作って サーバーとクライアントの役割を逆にさせたら良いのでは? とのアイディアを元に実装してみました。 クライアント側フォーム: ラジオボタンコントロール3個、テキストボックス1個、ラベル1個とボタンを貼り付け デザイナでラジオボタンのタグに1〜3を設定 サーバー側フォーム: リストボックス1個とラベル1個貼り付け 各プロジェクトのプロパティでアプリケーションタグの「ルート名前空間」を空欄にする。 各プロジェクトの参照でSystem.Runtime.Remotingを追加する。 コードは以下の通りです。 一応、やりたい事はある程度実現できました。 「ある程度」というのは、クライアント側のコードで Private Sub m_msgB_OnTrance()の 'Label1.Text = m_msg.CalcR.ToString という行のコメントを外すとフリーズしてしまいます。 つまり、このプロシージャ内でフォームのコントロールにアクセスできないようです。 (サーバーからの返り値を表示以外に固定文字列表示でもフリーズを確認) クライアント→サーバーでは同じコードで動いているのに逆では何故フリーズ するのでしょうか。スレッドが別になるとかの理由でしょうか。回避方法は あるのでしょうか。 コードだけファイルをアップしました。(ソルーション全体だとファイルサイズ制限オーバーでした)。
Azuleanさん、毎度ありがとうございます。 やはり、別スレッドになるのですね。 コントロールへアクセスする部分をBeginInvokeを使って呼び出すように 変えたら、見事うまくいきました(最初はInvokeを使いましたが、こちらはダメでした)。 BeginInvokeとInvokeとの違いは非同期的にデリゲートを実行するか否かです。 クライアントからサーバーへパラメータ送信して結果をクライアントのイベント ハンドラで受けているという流れの中でどのようにスレッドが生成されているのか 良く分かりません。 > ・.NET Remoting 自体は現状、新しく使うことは推奨されていないはずです。 これもMSDN調べている中で知りました。 Windows Communication Foundation (WCF)を使うべきなんですね。ただ、環境が .Net Framework2.0なので、使えないのです。WCFはコードを変えずに コンフィグレーション変えて色々なケース(自PC内やPC間など)に対応できるようで すね。 Azuleanさんのアドバイスで何とかテストプログラムが動いたので、本番用に 実装しようと思います。 ありがとうございました。 ■No28916に返信(Azuleanさんの記事) > 再現に手間がかかりそうだとみているため、とりあえず知っていることだけを書いておきます。 > > ・.NET Remoting で呼び出されるメソッドはメインスレッドで実行されるとは限りません。たいていは別スレッドで呼び出されていたはずです。 > フォームなどのコントロールを操作するのであれば、Invoke とか Dispatcher とか使ってください。 > > ・.NET Remoting 自体は現状、新しく使うことは推奨されていないはずです。 > ドキュメントが少なくとも嘆かず、自己責任で使う気持ちでいてください。 > http://msdn.microsoft.com/ja-jp/library/bb397831.aspx などは上部に「レガシー」ときちんと書いていますね。
分類:[.NET]