在.NET Remoting技术中可以远程进行事件通知,但是我在使用时发现问题,提示信息为:
不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System.DelegateSerializationHolder)在此安全级别上被反序列化。
但是我把安全级别设的很高,已经完全信任了,可是还是不行,不知道是怎么一回事?
所有的源代码如下:
RemoteObj dll的源代码:
public class RemoteObj:MarshalByRefObject
{
public delegate void TaskCompleteEventHandler(object sender, TaskCompleteEventArgs e);
public event TaskCompleteEventHandler TaskComplete;
protected void OnTaskComplete(TaskCompleteEventArgs e)
{
if (TaskComplete != null)
{
TaskComplete(this, e);
}
}
public void StartTask(int value)
{
Thread th = new Thread(new ParameterizedThreadStart((new RemoteObj()).DO));
th.Start(value);
}
/**
*传递的参数必须为object类型,否则编译出错
**/
private void DO(object value)
{
Thread.Sleep(1000);
OnTaskComplete(new TaskCompleteEventArgs(value));
}
}
[Serializable()]
public class TaskCompleteEventArgs : EventArgs
{
public object Result;
public TaskCompleteEventArgs(object result)
{
Result = result;
}
}
EventListener dll的源代码:
public class EventListener:MarshalByRefObject
{
public void TaskComplete(object sender, TaskCompleteEventArgs e)
{
Console.WriteLine("事件返回的值是: " + e.Result.ToString());
}
/**
* 重写生存期,限制为无限生存期,不会被释放的
**/
public override object InitializeLifetimeService()
{
return null;
}
}
Client客户端代码:
public class ClientEnd
{
static void Main(string[] args)
{
Invoke();
}
private static void Invoke()
{
EventListener listener = new EventListener();
TcpChannel tcpChannel = new TcpChannel(); //使用Tcp信道
ChannelServices.RegisterChannel(tcpChannel, false);
RemoteObj obj = (RemoteObj)Activator.GetObject(typeof(RemoteObj),
/**
* 问题:
* 在此安全基础上不成执行委托类型的反序列化,但是我已经配置了
* 完全信任该程序集,怎么还不行呢,奇怪??
**/
obj.TaskComplete += RemoteObj.TaskCompleteEventHandler(listener.TaskComplete);
obj.StartTask(100);
Console.ReadLine();
}
}
Server服务端代码:
class ServerEnd
{
static void Main(string[] args)
{
Console.WriteLine("正在创建服务端连接.......");
TcpChannel tcpChannel = new TcpChannel(8092);
ChannelServices.RegisterChannel(tcpChannel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObj),
"RemoteObj", WellKnownObjectMode.SingleCall);
Console.WriteLine("连接创建完毕,可以接收客户端调用了.....");
Console.WriteLine("敲回车可以退出服务.....");
Console.ReadLine();
}
}
有谁知道说一下.