[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