读书人

关于 Remoting,该怎么解决

发布时间: 2012-02-01 16:58:19 作者: rapoo

关于 Remoting
using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Security.Permissions;
using System.Runtime.Serialization.Formatters;
using Remote;

namespace YiLongServer
{
[Serializable]
class Server
{
static void Main(string[] args)
{
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props[ "port "] = 9090;
TcpChannel serverChannel = new TcpChannel(props, null, provider);
ChannelServices.RegisterChannel(serverChannel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "Update ", WellKnownObjectMode.SingleCall);
Console.WriteLine( "Press return to exit ");
Console.ReadLine();
}
}
}

服务器


远程对象

using System;
using System.Data;
using System.Threading;
using System.Data.SqlClient;

namespace Remote
{
public class RemoteObject : MarshalByRefObject
{
public delegate void StatusEvent(object sender, StatusEventArgs e);

public event StatusEvent Status;

public RemoteObject()
{
Console.WriteLine( "One Object has created ");
}

~RemoteObject()
{
Console.WriteLine( "One Object has destroy ");
}
public void LongWorking(int ms)


{
Console.WriteLine( "RemoteObject:LongWorking() Started ");
StatusEventArgs e = new StatusEventArgs( "Message for Client:LongWork() Started ");
if(Status!=null)
{
Console.WriteLine( "RemoteObject:Firing Starting Event ");
Status(this,e);
}
System.Threading.Thread.Sleep(ms);
e.Message = "Message for Client LongWorking Ending ";
if(Status!=null)
{
Console.WriteLine( "RemoteObject:Firing Ending Event ");
Status(this,e);
}
Console.WriteLine( "RemoteObject LongWorking() Ending ");
}
}

[Serializable]
public class StatusEventArgs
{
private string message;
public StatusEventArgs(string m)
{
message = m;
}

public string Message
{
get{
return message;
}
set{
message = value;
}


}
}
}


Client

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Messaging;
using Remote;

namespace Client
{
class Program
{
static void Main(string[] args)
{
Remote.RemoteObject Shareobject = (Remote.RemoteObject)Activator.GetObject(typeof(Remote.RemoteObject), "tcp://localhost:9090/Update "); //125.45.61.205:9090
Console.WriteLine(Shareobject.GetHashCode().ToString());
EventSink sink = new EventSink();

Shareobject.Status += new RemoteObject.StatusEvent(sink.StatusHandler);

Shareobject.LongWorking(5000);
Console.WriteLine(Shareobject.GetHashCode().ToString());
Console.ReadLine();
}
}

public class EventSink : MarshalByRefObject
{
public EventSink()
{
}

public void StatusHandler(object sender, StatusEventArgs e)
{
Console.WriteLine( "EventSink:Event occurred: "+e.Message);
}
}
}


为什么每次这个地方都运行到这句就报错
Shareobject.Status += new RemoteObject.StatusEvent(sink.StatusHandler);

Exception has been thrown by the target of an invocation


请问怎么销毁远程对象

谢谢

[解决办法]
我先UP,晚上有空把你的代码拿出来调试一下,你Debug看那些变量是否是你预期的那样?
[解决办法]
mark

读书人网 >C#

热点推荐