[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