MarshalByRefObject 是通過使用代理交換訊息來跨應用程式定義域邊界進行通訊的對象的基類。不是從
MarshalByRefObject 繼承的對象根據值隱式封送。當遠程應用程式引用根據值封送的對象時,將跨應用程式定義域邊界傳遞該對象的副本。
===================
//程式1和程式2的共有類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RemoteObject
{
public class CommunicationInfo : MarshalByRefObject
{
public CommunicationInfo()
{
}
public override object InitializeLifetimeService()
{
//////return base.InitializeLifetimeService();
System.Runtime.Remoting.Lifetime.ILease aLease
= (System.Runtime.Remoting.Lifetime.ILease)base.InitializeLifetimeService();
if (aLease.CurrentState == System.Runtime.Remoting.Lifetime.LeaseState.Initial)
{
// 不到期
aLease.InitialLeaseTime = TimeSpan.Zero;
}
return aLease;
}
public class CommunicationEventArg : EventArgs
{
}
public delegate void JobAddEventHandler(CommunicationEventArg e);
public event JobAddEventHandler OnJobAdd;
public void CallJobAddEvent()
{
OnJobAdd(new CommunicationEventArg());
}
}
}
================================================
程式1(伺服器端)啟動時運行
參照中追加System.Runtime.Remoting
RemoteObject.CommunicationInfo _communicationInfo;
System.Runtime.Remoting.Channels.Tcp.TcpServerChannel servChannel = new System.Runtime.Remoting.Channels.Tcp.TcpServerChannel(18089);
System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(servChannel, true);
_communicationInfo = new RemoteObject.CommunicationInfo();
_communicationInfo.OnJobAdd += new RemoteObject.CommunicationInfo.JobAddEventHandler(_communicationInfo_OnJobAdd);
System.Runtime.Remoting.RemotingServices.Marshal(_communicationInfo, "message1",typeof(RemoteObject.CommunicationInfo));
//測試事件
privatevoid _communicationInfo_OnJobAdd(RemoteObject.CommunicationInfo.CommunicationEventArg e)
{
MessageBox.Show("TEST OK");
}
================================================
程式2(用戶端)調用方法時運行
參照中追加System.Runtime.Remoting
System.Runtime.Remoting.Channels.Tcp.TcpClientChannel _clientChannel;
_clientChannel = new System.Runtime.Remoting.Channels.Tcp.TcpClientChannel();
System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(_clientChannel, true);
RemoteObject.CommunicationInfo _communicationInfo;
_communicationInfo = (RemoteObject.CommunicationInfo)
System.Activator.GetObject(typeof(RemoteObject.CommunicationInfo),"tcp://localhost:18089/message1", System.Runtime.Remoting.WellKnownObjectMode.Singleton);
_communicationInfo.CallJobAddEvent();//啟動事件