[Mono-devel-list] Remoting problem with cross-domain objects

Urs Muff umuff at quark.com
Fri Apr 25 16:40:09 EDT 2003


<server.cs>

using System;

using System.Collections;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels.Tcp;

 

public class ServerObjImpl : MarshalByRefObject, ServerObj

{

   string mName;

   public ServerObjImpl(string name) { mName = name; }

 

   #region ServerObj Members

 

   public string Name { get { return mName; } }

 

   public string DoIt(string arg)

   {

       string ret = string.Format("{0} @ {1}:
{2}",Name,AppDomain.CurrentDomain.FriendlyName,arg);

       Console.WriteLine(ret);

       return ret;

   }

 

   #endregion

}

 

class ServerBrokerImpl : MarshalByRefObject, ServerBroker

{

   IDictionary mMap = new Hashtable();

 

   #region ServerBroker Members

 

   public void RegisterServer(string which, ServerObj obj)

   {

       Console.WriteLine(string.Format("[{0}]: Register
({1},{2})",AppDomain.CurrentDomain.FriendlyName,which,obj.Name));

       mMap[which] = obj;

   }

 

   public ServerObj GetServerObj(string which)

   {

       return mMap[which] as ServerObj;

   }

 

   #endregion

}

 

class Server

{

   [STAThread]

   static void Main(string[] args)

   {

       RemotingHelper.RegisterBinaryChannel(8123);

 
RemotingConfiguration.RegisterWellKnownServiceType(typeof(ServerBrokerImpl),
"Broker",WellKnownObjectMode.Singleton);

 

       ServerBroker broker =
Activator.GetObject(typeof(ServerBroker),"tcp://localhost:8123/Broker") as
ServerBroker;

 

       broker.RegisterServer("First",new ServerObjImpl("Primary Server
Object"));

       ServerObj obj = AppDomain.CreateDomain("Second Server
Domain").CreateInstanceAndUnwrap(

 
typeof(ServerObjImpl).Assembly.FullName,typeof(ServerObjImpl).FullName,false
,

          System.Reflection.BindingFlags.Default,null,new
object[]{"Separated Server Object"},null,null,null

          ) as ServerObj;

       broker.RegisterServer("Second",obj);

 

       Console.WriteLine("Server up and running [hit enter to exit]");

       Console.ReadLine();

   }

}

</server.cs>

 

<common.cs>

using System;

 

public interface ServerObj

{

   string Name { get; }

   string DoIt(string arg);

}

 

public interface ServerBroker

{

   ServerObj GetServerObj(string which);

   void RegisterServer(string which,ServerObj obj);

}

 

public class RemotingHelper

{

   public static System.Runtime.Remoting.Channels.IChannel
RegisterBinaryChannel(int port)

   {

       return RegisterChannel(port,new
System.Runtime.Remoting.Channels.BinaryServerFormatterSinkProvider(),true);

   }

   public static System.Runtime.Remoting.Channels.IChannel
RegisterSoapChannel(int port)

   {

       return RegisterChannel(port,new
System.Runtime.Remoting.Channels.SoapServerFormatterSinkProvider(),false);

   }

   public static System.Runtime.Remoting.Channels.IChannel
RegisterChannel(int
port,System.Runtime.Remoting.Channels.IServerChannelSinkProvider
provider,bool tcp)

   {

       System.Collections.IDictionary props = new
System.Collections.Hashtable();

       System.Runtime.Remoting.Channels.IChannel channel = null;

          

       System.Reflection.MemberInfo[] info =
provider.GetType().GetMember("TypeFilterLevel");

       if (info.Length > 0) 

       {

          ((info[0]) as System.Reflection.PropertyInfo).SetValue(provider,

 
Type.GetType("System.Runtime.Serialization.Formatters.TypeFilterLevel").GetF
ield("Full").GetValue(null),null);

       }

       props["port"] = port;

 

       if (tcp) channel = new
System.Runtime.Remoting.Channels.Tcp.TcpChannel(props, null, provider);

       //else channel = new
System.Runtime.Remoting.Channels.Http.HttpChannel(props, null, provider);

 
System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(channel);

 

       return channel;

   }

}

</common.cs>

 

<client.cs>

using System;

 

class Client

{

   [STAThread]

   static void Main(string[] args)

   {

       RemotingHelper.RegisterBinaryChannel(0);

       Console.ReadLine();

       ServerBroker broker =
Activator.GetObject(typeof(ServerBroker),"tcp://localhost:8123/Broker") as
ServerBroker;

 

       ServerObj obj1 = broker.GetServerObj("First");

       ServerObj obj2 = broker.GetServerObj("Second");

       

       try

       {

          if (obj1 != null) Console.WriteLine(obj1.DoIt("First call"));

          if (obj2 != null) Console.WriteLine(obj2.DoIt("Second call"));

       }

       catch (Exception ex)

       {

          Console.WriteLine(ex);

       }

 

       Console.WriteLine("Client done [hit enter to exit]");

       Console.ReadLine();

   }

}

</client.cs>

 

mcs -g -r System.Runtime.Remoting Common.cs Server.cs -o Server.exe

mcs -g -r System.Runtime.Remoting Common.cs Client.cs -o Client.exe

 

Error with latest CVS version [from yesterday]:

mono --debug Server.exe

Unhandled Exception: System.Runtime.Remoting.RemotingException: Some sort of
w32 error occurred: 0

 

Server stack trace:

in <0x000da> 00
System.Runtime.Remoting.Channels.Tcp.HostConnectionPool:CreateConnection ()

in <0x00108> 00
System.Runtime.Remoting.Channels.Tcp.HostConnectionPool:GetConnection ()

in <0x00121> 00
System.Runtime.Remoting.Channels.Tcp.TcpConnectionPool:GetConnection
(string,int)

in <0x00026> 00
System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink:ProcessMessage
(System.Runtime.Remoting.Mess

aging.IMessage,System.Runtime.Remoting.Channels.ITransportHeaders,System.IO.
Stream,System.Runtime.Remoting.Channels.ITra

nsportHeaders&,System.IO.Stream&)

in <0x001e7> 00
System.Runtime.Remoting.Channels.BinaryClientFormatterSink:SyncProcessMessag
e (System.Runtime.Remoting.M

essaging.IMessage)

 

 

Exception rethrown at [0]:

 

in <0x000c3> 00 System.Runtime.Remoting.Proxies.RealProxy:PrivateInvoke
(System.Runtime.Remoting.Proxies.RealProxy,Syste

m.Runtime.Remoting.Messaging.IMessage,System.Exception&,object[]&)

in (unmanaged) 07 .ServerBroker:RegisterServer (string,ServerObj)

in <0x00004> 07 .ServerBroker:RegisterServer (string,ServerObj)

in [0x0004a] (at c:\data\Projects\Test\ErrorIn1.1Remoting\Server.cs:59) 00
.Server:Main (string[])

 

- Urs C. Muff

Software Architect      - Research Lab

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20030425/3d846cd9/attachment.html 


More information about the Mono-devel-list mailing list