C# 使用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();//启动事件