[Mono-list] error of remoting
Wei Lu
wlu@21cn.com
Thu, 10 Jul 2003 16:28:38 +0800
Hi there,
I have a problem on mono Remoting.
For this program:
//mcs -r:ServerObject.dll -r:System.Runtime.Remoting.dll RemotingServer.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemotingTest
{
class RemotingServer
{
static int Main ()
{
Console.WriteLine("Starting Server");
TcpChannel ch = new TcpChannel(1122);
ChannelServices.RegisterChannel (ch);
ServerList ser = new ServerList();
RemotingServices.Marshal(ser,"test.rem");
Console.WriteLine("Server Running ...");
Console.ReadLine();
ch.StopListening (null);
return 0;
}
}
}
it runs well. but when i press enter to terminate it, even without any client access ever, an error dialog pops:
*** ERROR ***: file threads.c: line 885 (ves_icall_System_Threading_Thread_Abort): should not be reached aborting...
if i comment the line: ch.StopListening (null);
the error message in console becomes:
** (remotingserver.exe:18668): CRITICAL **: file mono-hash.c: line 396 (mono_g_h
ash_table_remove): assertion `hash_table != NULL' failed
this is what i'm using:
Mono JIT compiler version 0.25, (C) 2002, 2003 Ximian, Inc.
on Windows 2000 Pro SP3.
The ServerObject used in above problem is as follows.
//mcs -t:library ServerObject.cs
using System;
using System.Runtime.Remoting;
using System.Collections;
namespace RemotingTest
{
// A list of ServerObject instances
public class ServerList: MarshalByRefObject
{
ArrayList values = new ArrayList();
public void Add (ServerObject v)
{
values.Add (v);
System.Console.WriteLine ("Added " + v.Name);
}
public void ProcessItems ()
{
System.Console.WriteLine ("Processing...");
int total = 0;
foreach (ServerObject ob in values)
total += ob.GetValue();
System.Console.WriteLine ("Total: " + total);
}
public void Clear()
{
values.Clear();
}
public ServerObject NewItem(string name)
{
ServerObject obj = new ServerObject(name);
Add (obj);
return obj;
}
public ComplexData SetComplexData (ComplexData data)
{
System.Console.WriteLine ("Showing content of ComplexData");
data.Dump ();
return data;
}
}
// A remotable object
public class ServerObject: MarshalByRefObject
{
int _value;
string _name;
public ServerObject (string name)
{
_name = name;
}
public string Name
{
get { return _name; }
}
public void SetValue (int v)
{
System.Console.WriteLine ("ServerObject " + _name + ": setting " + v);
_value = v;
}
public int GetValue ()
{
System.Console.WriteLine ("ServerObject " + _name + ": getting " + _value);
return _value;
}
}
// Some complex data for testing serialization
public enum AnEnum { a,b,c,d,e };
[Serializable]
public class ComplexData
{
public AnEnum Val = AnEnum.a;
public object[] Info;
public ComplexData (AnEnum va, object[] info)
{
Info = info;
Val = va;
}
public void Dump ()
{
System.Console.WriteLine ("Content:");
System.Console.WriteLine ("Val: " + Val);
foreach (object ob in Info)
System.Console.WriteLine ("Array item: " + ob);
}
}
}
Anyone knows why? Thank you!
Sincerely,
Wei Lu
wlu@21cn.com