C# 使用MarshalByRefObject跨程序调用方法

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();//启动事件
上一篇:mysql 权限控制具体解释


下一篇:浅谈SystemClock 和Thead的区别和联系