1.创建服务端Class:ProxyServerRemoting

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using Inscription.Manadal.EmrPlugIn.NetMessage;
 5 using NLog;
 6 using Inscription.Manadal.EmrPlugIn;
 7 using System.ComponentModel;
 8 using System.Runtime.Remoting;
 9 using System.Runtime.Remoting.Channels.Tcp;
10 using System.Runtime.Remoting.Channels;
11
12 namespace Inscription.Mandala.EmrPlugIn.ProxyServer
13 {
14     public class ProxyServerRemoting
15     {
16         // 监听端口
17         private static int port;
18         // 单例对象
19         private static ProxyServerRemoting Instance = null;
20         // 后台工作线程对象
21         private BackgroundWorker backWork = null;
22         //定义服务端监听信道
23         private static TcpServerChannel tcpServerChannel = null;
24
25         private ProxyServerRemoting()
26         {
27             //创建后台工作对象(线程)
28             backWork = new BackgroundWorker();
29             //绑定DoWork事件程序
30             backWork.DoWork += new DoWorkEventHandler(backWork_DoWork);
31             //开始执行后台操作
32             backWork.RunWorkerAsync();
33         }
34
35         /// <summary>
36         /// 后台线程
37         /// </summary>
38         /// <param name="sender"></param>
39         /// <param name="e"></param>
40         private void backWork_DoWork(object sender, DoWorkEventArgs e)
41         {
42             StartServer();
43         }
44
45         /// <summary>
46         /// 单例实现
47         /// </summary>
48         /// <returns></returns>
49         public static ProxyServerRemoting getInstance(int Port)
50         {
51             if (Instance == null)
52             {
53                 Instance = new ProxyServerRemoting();
54                 tcpServerChannel = new TcpServerChannel(port);
55                 port = Port;
56             }
57             return Instance;
58         }
59
60         /// <summary>
61         /// 启动服务
62         /// </summary>
63         public void StartServer()
64         {
65             ChannelServices.RegisterChannel(tcpServerChannel, false);
66
67             RemotingConfiguration.RegisterWellKnownServiceType(typeof(epiManagerV2), "GetEmrPlugInFunctionV3", WellKnownObjectMode.Singleton);
68         }
69
70         /// <summary>
71         /// 停止服务
72         /// </summary>
73         public void StopServer()
74         {
75             ChannelServices.UnregisterChannel(tcpServerChannel);
76         }
77     }
78 }

2.创建客户端调用Class:ProxyClient

客户端每次调用完成以后,需要注销掉当前信道,ChannelServices.UnregisterChannel(tcpChannel);

不然会发生异常:信道tcp已注册

using System;
using System.Collections.Generic;
using System.Text;
using NLog;
using System.Runtime.Remoting.Channels.Tcp;
using System.Diagnostics;
using System.Configuration;
using System.Reflection;
using System.Runtime.Remoting.Channels;
using Inscription.Manadal.EmrPlugIn;namespace Inscription.Mandala.EmrPlugIn.ProxyClient
{public static class ProxyClient{/// <summary>/// 获取基于函数的外部接口/// </summary>/// <param name="MainName"></param>/// <param name="ConfigInfo"></param>/// <param name="worker"></param>/// <param name="patientIndex"></param>/// <returns></returns>public static string GetEmrPlugInFunctionV3(string MainName, string ConfigInfo, string strWorker, string strPatientIndex, string CommandKey, string strParamLst){TcpChannel tcpChannel = null;Logger logger = NLogManagerV2.GetLogger("GetEmrPlugInFunctionV3_Client");try{logger.Trace("判断服务端进程是否存在");string strAppName = "IMPIProxyServer";Process[] curProcesses = Process.GetProcesses();bool isExist = false;foreach (Process p in curProcesses){if (p.ProcessName == strAppName){isExist = true;logger.Trace("服务端进程存在");break;}}if (isExist == false){logger.Trace("服务端进程不存在");Process.Start(strAppName);logger.Trace("重新启动服务端进程");}//int port = 3399;string ip = ConfigurationManager.AppSettings["ServerIP"];int port = Convert.ToInt32(ConfigurationManager.AppSettings["ServerPort"]);logger.Trace("监听IP:" + ip + "    监听端口" + port);//使用TCP通道得到远程对象tcpChannel = new TcpChannel();ChannelServices.RegisterChannel(tcpChannel, false);IepiManagerV2 manager = (IepiManagerV2)Activator.GetObject(typeof(IepiManagerV2), string.Format("tcp://{0}:{1}/GetEmrPlugInFunctionV3", ip, port));logger.Trace("取得.Net Remoting对象成功");string strReturn = manager.GetEmrPlugInFunctionV3(MainName, ConfigInfo, strWorker, strPatientIndex, CommandKey, strParamLst);logger.Trace("客户端调用结束");return strReturn;}catch (Exception ex){logger.Trace(ex.Message);return string.Empty;}finally{ChannelServices.UnregisterChannel(tcpChannel);}}}
}

3.业务类:epiManagerV2

业务类实现了IepiManagerV2接口,其中客户端也链接引用了IepiManagerV2接口文件,这样客户端就摆脱了对具体业务Dll的依赖,

客户端编译成一个单独的dll可被第三方程序调用。

public class epiManagerV2 :  MarshalByRefObject,IepiManagerV2
{/// <summary>/// 获取基于函数的外部接口/// </summary>/// <param name="MainName"></param>/// <param name="ConfigInfo"></param>/// <param name="worker"></param>/// <param name="patientIndex"></param>/// <returns></returns>public string GetEmrPlugInFunctionV3(string MainName, string ConfigInfo, string strWorker, string strPatientIndex, string CommandKey, string strParamLst){实现略}
}

IepiManagerV2接口类

using System;
namespace Inscription.Manadal.EmrPlugIn
{interface IepiManagerV2{string GetEmrPlugInFunctionV3(string MainName, string ConfigInfo, string strWorker, string strPatientIndex, string CommandKey, string strParamLst);}
}

4.服务端管理工具

实现启动服务,暂停服务,开机自动运行功能

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Configuration;
using Microsoft.Win32;
using System.IO;namespace Inscription.Mandala.EmrPlugIn.ProxyServer
{public partial class frmMainServer : Form{private ProxyServerRemoting Instance = null;string ip = "127.0.0.1";int port = 3399;public frmMainServer(){InitializeComponent();}/// <summary>/// 初始化/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void frmMain_Load(object sender, EventArgs e){InitForm();StartServer();}private void InitForm(){this.ip = ConfigurationManager.AppSettings["ServerIp"];this.port = Convert.ToInt32(ConfigurationManager.AppSettings["ServerPort"]);}/// <summary>/// 打开服务端/// </summary>private void StartServer(){try{Instance = ProxyServerRemoting.getInstance(port);Instance.StartServer();btnStart.Enabled = false;btnStop.Enabled = true;lblStatus.Text = "服务正在运行";}catch(Exception ex){MessageBox.Show(ex.Message);}}/// <summary>/// 关闭服务/// </summary>private void StopServer(){try{Instance.StopServer();btnStart.Enabled = true;btnStop.Enabled = false;lblStatus.Text = "服务已关闭";}catch (Exception ex){MessageBox.Show(ex.Message);}}/// <summary>/// 窗口显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void frmMainServer_Shown(object sender, EventArgs e){this.Hide();}/// <summary>/// 启动/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStart_Click(object sender, System.EventArgs e){StartServer();}/// <summary>/// 暂停服务器/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void tsbStop_Click(object sender, EventArgs e){StopServer();}/// <summary>/// 关闭/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void frmMainServer_FormClosing(object sender, System.ComponentModel.CancelEventArgs e){Instance.StopServer();}/// <summary>/// 菜单命令/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e){switch (e.ClickedItem.Text){case "打开":this.Show();break;case "隐藏":this.Hide();break;case "关闭":Instance.StopServer();this.Close();break;}}/// <summary>/// 工具栏事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e){switch (e.ClickedItem.Name){case "tsbAutoRun":SetAutoRun(Core.App.fullPath, true);break;case "tsbAutoRunCancel":SetAutoRun(Core.App.fullPath, false);break;}}private void notifyIcon1_DoubleClick(object sender, EventArgs e){this.Show();}/// <summary>/// 设置应用程序开机自动运行/// </summary>/// <param name="fileName">应用程序的文件名</param>/// <param name="isAutoRun">是否自动运行,为false时,取消自动运行</param>/// <exception cref="System.Exception">设置不成功时抛出异常</exception>private static void SetAutoRun(string fileName, bool isAutoRun){RegistryKey reg = null;try{String name = fileName.Substring(fileName.LastIndexOf(@"\") + 1);reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);if (reg == null)reg = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");if (isAutoRun)reg.SetValue(name, fileName);elsereg.SetValue(name, false);}catch (Exception ex){MessageBox.Show(ex.Message);}finally{if (reg != null)reg.Close();}}public static void Test(){frmMainServer f = new frmMainServer();f.Show();}}
}

转载于:https://www.cnblogs.com/linuxjava01/p/3731766.html

.NET Remoting 入门实例相关推荐

  1. Remoting入门实例

    前些时候看到园子里一位朋友写的.NET 框架 AAF (作者:http://blog.csdn.net/aafshzj),作者对其大为赞赏. 因为自己在开发过程中碰到一些性能问题,一时不知如何解决,索 ...

  2. Asp.Net MVC2.0 Url 路由入门---实例篇

    本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...

  3. SpringMVC 框架系列之初识与入门实例

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.SpringMVC 概述 (1).什么是 MVC:Model-View-Control Co ...

  4. 《HFSS电磁仿真设计从入门到精通》一第2章 入门实例——T形波导的内场分析和优化设计...

    本节书摘来自异步社区<HFSS电磁仿真设计从入门到精通>一书中的第2章,作者 易迪拓培训 , 李明洋 , 刘敏,更多章节内容可以访问云栖社区"异步社区"公众号查看 第2 ...

  5. python爬虫实例-10个python爬虫入门实例

    昨天带伙伴萌学习python爬虫,准备了几个简单的入门实例 涉及主要知识点: web是如何交互的 requests库的get.post函数的应用 response对象的相关函数,属性 python文件 ...

  6. python爬虫程序实例-10个python爬虫入门实例

    作者:h3zh1 来源:cnblogs.com/h3zh1/p/12548946.html 今天为大家准备了几个简单的python爬虫入门实例,分享给大家. 涉及主要知识点:web是如何交互的 req ...

  7. ADO.NET Entity Data Model入门实例

    ADO.NET Entity Data Model入门实例 快速开发一个网站,最繁琐的地方可能要算数据库访问和ORM了,还好.net中这个很强大,可以省去好多体力劳动. 这里就给个快速使用ADO.NE ...

  8. Java Socket入门实例

    基于测试驱动的Socket入门实例(代码的具体功能可以看我的程序中的注释,不理解的可以短信我) 先看Server的代码: package socketStudy; import java.io.Buf ...

  9. linux Shell(脚本)编程入门实例讲解详解

    linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集, ...

最新文章

  1. 为什么我的DevOps落地过程跟别人不一样?
  2. Spring框架是怎么解决Bean之间的循环依赖的 (转)
  3. 笔记-高项案例题-2014年下-计算题
  4. Redis缓存穿透、缓存击穿和缓存雪崩
  5. java大佬是如何快速配置IntelliJ IDEA的Tomcat及安装配置Tomcat及java开发环境
  6. php 渐变色,段落每行渐变色文本效果
  7. 【Pytorch神经网络理论篇】 17 循环神经网络结构:概述+BP算法+BPTT算法
  8. Qt学习笔记-简单的TCP程序
  9. datables自定义ajax,JQuery DataTables.net自定义列宽度在ajax加载后不起作用
  10. Visio2003 下载
  11. Ubuntu衍生发行版使用体验(lubuntu、xubuntu、kubuntu)
  12. 通常网站当中的关键词密度如何控制呢
  13. 水花兄弟又凑齐了(20220111 Week2-1)
  14. 2021年最新友价商城源码 优化实名认证模块 19套PC模板2套手机模板 服务市场 任务大厅
  15. 【源码阅读】SIR-GN: A Fast Structural Iterative Representation Learning Approach For Graph Nodes
  16. easyrecovery professional专业版下载 v14.0.0.0 专业版介绍
  17. 分类变量和连续变量的相关性度量
  18. 按钮点击事件(java)
  19. copay mysql数据库_MySQL无法添加外键约束
  20. 谁能提供一个带条码生成器的CorelDRAW 9 ?

热门文章

  1. 数据库,部分函数依赖,传递函数依赖,完全函数依赖,三种范式的区别
  2. 后端根据百度地图真实路径距离_百度地图开放平台介绍--路线规划
  3. mysql范围条件_MySQL8.0之跳跃范围扫描
  4. STM8学习笔记---Modbus通信协议简单移植
  5. Linux下tar压缩与解压缩文件
  6. HDU-Keywords Search(AC自动机)
  7. 图像算法一:【图像点运算】灰度直方图、伽马变换、灰度阈值变换、分段线性变换、直方图均衡化
  8. Java对象的serialVersionUID在序列化和反序列化的用途
  9. 图像超分辨率(Super-Resolution)技术研究
  10. 纳尼?我的Gradle build编译只要1s