none
.NET Remotingで転送できる型は何か? RRS feed

  • 質問

  • お世話になります。

    Remotingに関して質問させて下さい。

     

    同一コンピュータ上で異なるプロセス間の通信に、.NET Remotingを使用しています。

    概ね動作しておりますが、BitmapクラスをRemotingで渡してクイックウォッチで確認すると・・・Bitmap型のはずなのにTransparentProxy(透過プロクシ)に変換されてしまいます。

    その透過プロクシに対して、Bitmapクラスが実装するメソッドをコールすると、下記のメッセージのRemotingExceptionがスローされてしまいます。

    “このリモート処理プロキシには、チャネル シンクがありません。待機中のサーバー チャネルが登録されていないか、またはこのアプリケーションに、サーバーと通信する適切なクライアント チャネルがありません。”

    Bitmap以外にも幾つかのクラスで試してみましたが、.NET Frameworkから提供されているクラスをRemotingで渡そうとすると、TransparentProxy(透過プロクシ)に変換されていました。

    そもそも「何が原因でTransparentProxyに変換されるクラスと、変換されないクラスがあるのか」が理解できておりません。

    Remotingの知識を深めるために、原因を掴みたいと思っています。

    ヒントでも良いのですが、助言を頂けたら助かります。

    下記は再現コードです。

     

    【サーバープロセス】

    			BinaryServerFormatterSinkProvider tProvider = new BinaryServerFormatterSinkProvider();
    			tProvider.TypeFilterLevel = TypeFilterLevel.Full;
    	
    			IDictionary properties = new Hashtable();
    			properties["port"] = 8000;
    			properties["name"] = "channelName";
    
    			ChannelServices.RegisterChannel(new TcpChannel(properties, null, tProvider), false);
    
    			RemotingConfiguration.RegisterWellKnownServiceType(
    				typeof(RemoteClass),
    				"theEndPoint",
    				WellKnownObjectMode.Singleton);

    【クライアントプロセス】

    			ChannelServices.RegisterChannel(new TcpChannel(), false);
    			remoteObject = (RemoteClass)Activator.GetObject(typeof(RemoteClass), "tcp://localhost:8000/theEndPoint");
    
    			Bitmap bmp = (Bitmap)Bitmap.FromFile(@"C:\FromImage.bmp");
    
    			remoteObject.SaveImage(bmp);

     

    【リモートクラス】

    	public class RemoteClass : MarshalByRefObject
    	{
    		public void SaveImage(Bitmap bmp)
    		{
    			bmp.Save(@"C:\test.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
    		}
    	}

     

    【テスト環境】

    IDE : Visual Studio 2008 Professional Edition SP1

    OS : Windows XP Professional Edition SP3

    2010年5月14日 13:11

回答