分享

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

 zww_blog 2014-01-17

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多