C#采用Remoting实现跨进程调用之代码实例

C#中利用remoting对应用程序跨进程调用 项目需求:          因项目需求有变,需将目前系统拆分为单独的两个子系统,分别为图像监控系统,文件识别系统,做成单独DLL,便日后复用。          现针对拆分过程中,遇到C#中对于应用程序跨进程调用的问题,便上网查阅相关资料,觉得有必要记录一下,在此整理一下,便日后学习。 查阅之前,先百度文库了一下一些概念性的知识点,这些后期都会用到,脑子里有个大体印象,且如果你仔细 阅读详情

前言 

辛苦了几个月,期间第一次接触C#的东西,一直很忙碌,如今年底将至,停车场系统目前也即将交货,回顾自己在该系统中所实现的功能,开发过程中遇到的技术点滴,觉得有必要认真记录一下,以便日后翻阅。故以C#中通过Remoting跨进程调用为例,为该系统做个小结。

博客之前有一篇针对C# 跨进程调用的文章,但这些都是网上搜集,原创成分太少,故为此补一篇原创文章,以下代码均为自己结合系统中需要,自己做的小demo,以便初学者更好理解跨进程调用的思想。

1. 新建解决方案,该解决方案中有三个工程,分别是Client(客户端),IRpcAdapter(Server端函数接口),Server(服务端)。

2. 该解决方案中的Client工程和Server工程均为独立的C#可执行程序,IRpcAdapter为类库。       

3. Client工程

注:该工程中只有Form的frmClient类代码,同时需引入系统的Remoting命名空间和自定义的外部类库IRpcAdapter命名空间。

frmClient.cs代码

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Runtime.Remoting.Channels.Tcp;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting;

namespace Client

{

    ///<summary>

    ///拍照程序

    ///</summary>

    publicpartial class frmClient : Form

    {

        public frmClient()

        {

            InitializeComponent();

        }

        //图片全路径

        string argImgPath =@"c:\\images\test.jpg";

        //端口号

        staticstring argPort = "01";

        //拍摄时间

        staticDateTime argSnapShotTime = DateTime.Now;

        ///<summary>

        ///测试

        ///</summary>

        ///<param name="sender"></param>

        ///<param name="e"></param>

        privatevoid btnTest_Click(object sender,EventArgs e)

        {

            /********************************************/

            /*                拍照处理                 */

            /********************************************/ 

            //调用识别程序

            string plateNo = this.RegisteClientChannel(argImgPath, argPort, argSnapShotTime);

        }

        ///<summary>

        /// 注册Client管道

        ///</summary>

        ///<param name="args"></param>

        ///<returns></returns>

        publicstring RegisteClientChannel(string argImgPath,string argPort,DateTime argSnapShotTime)

        {

            //实例客户端对象

            TcpClientChannel channel = new TcpClientChannel();

            //注册客户端管道

            ChannelServices.RegisterChannel(channel,false);

            //获取远程对象

            IRpcAdapter.IPlateNo adapter = (IRpcAdapter.IPlateNo)Activator.GetObject(typeof(IRpcAdapter.IPlateNo),"tcp://localhost:8080/PlateIdentity");

            //远程调用函数

            string plateNo = adapter.PlateNo(argImgPath,argPort, argSnapShotTime);

            MessageBox.Show("车牌号:{0}"+plateNo);

            return plateNo;

        }      

    }

}

4. Server工程

注:该工程中除了Form的frmServer类之外,还需新建一个接口实现类(Adapter.cs),为公布的外部接口的具体实现类,该类中包含服务端所要公布的具体函数,同时为方便测试,新建一个识别程序类(ProcessPlate.cs)该类中只有一个用于外部调用的函数,也就是服务端公布给Client端调用的函数。同时仍需引入系统的Remoting命名空间和自定义的IRpcAdapter命名空间。

frmServer.cs代码

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

namespace Server

{

    ///<summary>

    ///识别程序

    ///</summary>

    publicpartial class frmServer : Form

    {

        public frmServer()

        {

            InitializeComponent();

        }

        //识别类处理对象

        staticProcessPlate plateProc = null; 

        publicstatic ProcessPlate PlateProc

        {

            get { return plateProc; }

            set { plateProc = value; }

        }

        ///<summary>

        /// Load事件

        ///</summary>

        ///<param name="sender"></param>

        ///<param name="e"></param>

        privatevoid frmServer_Load(object sender,EventArgs e)

        {

            ///****************************/

            ///*       数据一览         */

            ///****************************/ 

            //PlateProc = new ProcessPlate();

            RegisterServerChannel();          

        }

        ///<summary>

        ///注册Server管道

        ///</summary>

        publicstatic void RegisterServerChannel()

        {

            //实例Server对象

            TcpServerChannel channel = new TcpServerChannel(8080);

            //注册Server管道

            ChannelServices.RegisterChannel(channel,false);

            //配置远程对象注:PlateIdentity 为Client调用的函数名,例:tcp://localhost:8080/PlateIdentity

            RemotingConfiguration.RegisterWellKnownServiceType(typeof(Adapter),"PlateIdentity", WellKnownObjectMode.Singleton);

        } 

    }

}

Adatapter.cs实现类

using System;

using System.Collections.Generic;

using System.Text;

using IRpcAdapter;

namespace Server

{

    ///<summary>

    ///识别程序接口转换类

    ///</summary>

    publicclass Adapter : MarshalByRefObject, IPlateNo

    {

        ///<summary>

        ///接口内的定义函数

        ///</summary>

        ///<returns>车牌号</returns>

        publicstring PlateNo(string argImgPath,string argPort,DateTime argSnapShotTime)

        {

            string plateNo = Server.ProcessPlate.Process(argImgPath,argPort,argSnapShotTime);

            return plateNo;

        }

    }

}

ProcessPlate.cs识别车牌类

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Server

{

    ///<summary>

    ///车牌识别类

    ///</summary>

    publicclass ProcessPlate

    {

        ///<summary>

        ///识别程序函数

        ///</summary>

        ///<param name="argImgPath"></param>

        ///<param name="argPort"></param>

        ///<param name="argSnapShotTime"></param>

        ///<returns></returns>

        publicstatic string Process(string argImgPath,string argPort,DateTime argSnapShotTime)

        {

            string plateNo = "沪A 8888";

            /*************************************/

            /*************车牌识别处理************/

            /*************************************/

            return plateNo;

        }

    }

}

5. IRpcAdapter工程

注:该工程为外部的DLL,Client与Server都需引入其命名空间,新建一个类,自定义类名,目前定义为:IRpcAdapterMethod.cs

IRpcAdapterMethod.cs代码

using System;

using System.Collections.Generic;

using System.Text;

namespace IRpcAdapter

{

    ///<summary>

    ///识别程序接口

    ///</summary>

    publicinterface IPlateNo

    {

        string PlateNo(string argImgPath,string argPort,DateTime argSnapShotTime);

    }

}

小结:该工程为加深C#中采用Remoting对象以RPC管道形式对各种应用程序之间实现跨进程调用。在实际系统中,跨进程调用其另一程序的某一函数,经常有遇到,特别是在给某一系统添加外部辅助程序和引入第三方程序,在此记录,以便日后翻阅。

 

深入理解 C# Activator.GetObject 原理与 .NET Remoting 远程调用:技术分析与示例 本文介绍了.NET Remoting中的Activator.GetObject方法,阐述了其在分布式系统中的远程调用作用。该方法通过指定URL获取远程对象的代理,使客户端能透明调用远程服务。文章详细解析了其工作原理,包括代理对象、RealProxy和通信通道机制,并提供了创建远程对象、服务器和客户端的完整示例。尽管.NET Remoting因配置复杂、性能开销和平台限制等问题已被WCF和ASP.NET Core取代,但理解Activator.GetObject仍有助于处理老旧系统兼容问题。本文为开发者提供了 阅读详情

相关推荐

SpaceClaim二次开发实战:.NET远程处理与API跨进程调用指南

本文详细介绍了SpaceClaim二次开发中利用.NET远程处理技术实现API跨进程调用的实战指南。通过解析核心架构、提供完整代码示例与避坑指南,帮助开发者将SpaceClaim的几何建模能力集成到独立的应用程序中,实现稳定、高效的自动化建模服务。

ss78901的博客 1035

C#:跨进程方法使用

跨进程:我用大白话理解,就是一个主程序调用另一个程序的过程。 当前使用框架:WPF 设计模式:MVVM 主程序 view Command="{Binding Path=方法名}" viewmodel private RelayCommand 变量名; public RelayCommand 方法名字=> 方法名字?? (变量名= new RelayCommand(() => { try { //程序中

YiDabing9的博客 1412

基于Remoting技术的电子白板设计与实现

本文还有配套的精品资源,点击获取 简介:Remoting技术是一种跨进程通信机制,用于实现电子白板的协同聊天和共享功能。本项目利用Remoting技术,设计并实现了服务器端对象、客户端代理、协同聊天、事件驱动、安全与性能优化等关键组件,并提供了C#程序源代码。该项目旨在帮助开发者理解分布式系统原理和Remoting的工作方式,为构建复杂的分布式应用程序打下基础。 1....

weixin_42599908的博客 1009

C# Winform调用winapi SendMessage方法跨进程发送消息与接收消息

C# Winform窗口间消息通知,使用Windows API SendMessage方法跨进程实现消息发送,重写WndProc方法接收消息并消息处理 主要使用到如下三个方法函数: WndProc:主要用在拦截并处理系统消息和自定义消息 可以重写WndProc函数,来捕捉所有发生的窗口消息。这样,我们就可以"篡改"传入的消息,而人为的让窗口改变行为 SendMessage:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。该函数是.

樱花的博客 3224

Wine7.22实战:如何在Ubuntu上完美运行通达信和微信(附字体配置技巧)

本文详细介绍了如何在Ubuntu系统上使用Wine7.22版本,完美运行通达信和微信这两款Windows专属软件。通过选择稳定的Wine7.22版本、利用现成的兼容容器,并重点解决了中文字体渲染的核心难题,提供了从环境搭建、字体配置到软件安装调优的一站式实战指南,帮助用户在Linux环境下无缝使用关键金融与通讯工具。

weixin_29280657的博客 549

Cibersort免疫浸润 --- 详细教程

免疫浸润是指免疫细胞如淋巴细胞、浆细胞、巨噬细胞等进入到组织或器官中,并在这些组织或器官中发挥免疫功能的过程。免疫细胞的浸润可以是炎症反应的一部分,也可以是针对感染、肿瘤或其他疾病的免疫应答的一部分。免疫浸润通过调节免疫反应和炎症反应的程度和类型,起到维护机体免疫平衡和清除异常细胞或病原体的作用。在某些情况下,免疫浸润可能导致炎症反应过度,引起组织损伤,例如自身免疫性疾病。因此,免疫浸润在许多疾病的诊断和治疗中都具有重要的意义。免疫浸润可以通过组织切片染色和免疫组织化学等方法观察和分析。

ZxVSaccount的博客 9108

一个C#写的调用外部进程类

作者:肖波    C# 调用外部进程的类,网上可以搜出很多来,为什么要再写一遍,实在是因为最近从网上拷贝了一个简单的例程用到项目中,运行有问题,后来研究了半天,才解决了这些问题。于是打算写这么一篇博文,一来说说调用一个外部进程这么简单的一件事究竟会有哪些问题,二来也希望我写的这个相对比较完整的类可以为软件开发的同道们节约一些脑细胞,以便集中优势兵力解决那些真正高深复杂的软件问题。    在开始正题

aspgreener的专栏 623

告别编译失败:详解Keil MDK中ARM编译器V5与V6的区别及项目迁移选择

本文深入解析Keil MDK中ARM编译器V5与V6的核心差异,提供STM32项目迁移的完整指南。从代码生成策略、优化重点到语法支持,详细对比两版本特性,并给出项目兼容性评估框架和双版本共存配置方案,帮助开发者高效解决编译器版本冲突问题。

weixin_28684757的博客 516

C# 跨程序集调用常量、变量和函数

今天在给人讲C#程序集概念的时候突然被问住了,囧啊。所以又认真地看了下C#程序集的功能,本文就是关于C#跨程序集调用其他程序集的常量、变量和函数。 步骤1:建立两个程序集,分别是C#下的“Windows窗体应用程序”和“类库”,分别取名为“AAAAA”和“BBBBB”。程序集“BBBBB”中...

1776

具身智能ACT模型在lerobot机械臂上的实践与优化

本文详细介绍了如何在低成本lerobot机械臂上实践与优化具身智能ACT模型。从环境搭建、数据采集到模型原理与代码实战,提供了完整的入门指南。重点分享了通过数据增强、混合开源数据集及模型微调等策略,有效提升模型在抓取放置任务中的泛化能力与鲁棒性,为机器人学习爱好者提供了宝贵的实战经验。

weixin_29081703的博客 169

YOLO11,ultralytics-main源代码目录结构详解

本文详细介绍了YOLO11框架的ultralytics-main源代码目录结构,帮助用户更好地理解和使用YOLO模型。主要目录包括:docker文件夹,包含多种Docker镜像文件,适用于不同硬件环境;docs文件夹,存放YOLO的说明文档;examples文件夹,提供YOLO使用的示例代码;tests文件夹,包含单元测试模块;ultralytics文件夹,为核心代码所在,包含推理逻辑、配置、数据处理等模块。其中,engine文件夹负责训练和推理引擎,models文件夹存放模型架构,nn定义神经网络结构

qq_30279827的博客 1282

C# Remoting(RPC调用)

REMOTING是.NET自带的一种RPC调用方式。主要解决多个进程间互相的调用。 举例1:如现某一台电脑存在2个进程,进程1上存在一个按钮,点击按钮时会使进程2触发某个方法进行逻辑运算,那么我们存在的问题点在于如何让进程1联通进程2,同时让进程2自己去触发自己的某个方法。 举例2:如某一台电脑存在2个进程,2个进程现在都有可能修改某一个LIST,可以同时向这一个LIST中添加值或...

·穆·的博客 3173

【x264编码器】章节1——x264编码流程及基于x264的编码器demo

提供了一种方便的方式来根据指定的配置profile应用相应的设置到 x264 参数结构体上。不同的配置文件类型会对参数结构体进行不同的修改,以满足特定的编码需求。然后是编码器参数,包括帧参考数、最大关键帧间隔、最小关键帧间隔、B 帧数、场景切换阈值等。结构体的成员进行赋值,将其初始化为默认值。之后是一些编码器设置,如去块滤波、CABAC 编码、码率控制方法、参考帧压缩系数等。接下来是一系列与视频属性相关的参数,如色度格式、宽度、高度、宽高比等。然后是一些与日志输出、分析类型、量化矩阵等相关的参数。

vcvdv123的博客 5744

C# Remoting理解

问题:命名空间“System.Runtime.Remoting.Channels”中不存在类型或命名空间名“Tcp”(是否缺少程序集引用?) 解决:项目->添加引用->程序集->选中System.Runtime.Remoting

乌里随记的博客 1576

optee技术简介

OP-TEE(Open Portable Trusted Execution Environment)是一种开源的可信执行环境(TEE),专为ARM TrustZone架构设计。TEE是一种独立的执行环境,运行在主操作系统之外,为敏感任务提供安全的计算空间,如加密、身份验证、密钥管理等。

baron-周贺贺-代码改变世界ctw 1279

vue3 - 高德地图定位出错Get ipLocation failed.Geolocation permission denied.(info: “FAILED“ | status: 0)报错解决!

vue3,nuxt3,高德地图,定位,位置,报错,AMap.Geolocation,解决报当前定位失败,高德地图H5 定位失败报错,web网页网站,报错详细解决教程,Get ipLocation failed.Geolocation permission denied.,高德地图定位报错info: "FAILED",高德地图status: 0,已经是https了还是报错,确保了浏览器位置已经开了,手机定位也开了,没解决,H5页面在ios的浏览器上使用 高德地图 报当前定位失败Geolocation,移动端设

✅ 精选推荐文章 6771

C# Remoting的一个简单例子

 C# Remoting的一个简单例子 .Net对于远程调用提供了两种方法:Remoting和WebService。WebService现在是如火如荼,特别是有一种比较流行的架构:Winform+WebService(Java、.Net),我曾经做过的一个项目就是这样子的,分布式、跨平台、极佳的用户体验,这三者结合起来是不是很诱人?不过,这里我只说Remoting,Remoting具有以下

bmoon的专栏 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

远程调用——Remoting(C# )(转)

.Net对于远程调用提供了两种方法:Remoting和WebService。 WebService现在是如火如荼,特别是有一种比较流行的架构:Winform+WebService(Java、.Net),我曾经做过的一个项目就是这样子的,分布式、跨平台、极佳的用户体验,这三者结合起来是不是很诱人?不过,这里我只说Remoting,Remoting具有以下特点:1、Tcp通道的Remotin...

My Code Library 709

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# Remoting例子

4-23 https://www.cnblogs.com/zhengyun_ustc/archive/2006/06/09/remoting_InvalidCredentialException.html 今天看了一篇C# Remoting的一个简单例子,博主简单的介绍了remoting,目前所开发的系统也用到了remoting,特意重温了下系统,发觉其实也就那么回事情,服务器端定...

dayao8092的博客 216

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

关于C#中Remoting的使用

C#中Remoting的使用我使用Remoting的时候是使用配置文件的所以我这边就说下如何配置一个Remoting项目 我使用Remoting的时候是使用配置文件的所以我这边就说下如何配置一个Remoting项目 1.服务端配置 1).IIS发布 在D盘下新建一个文件夹Retire ,下面新建一个bin文件夹和web.comfig的配置文件,因为我是纯配置文件配置的所以注册消息通道比较方便,只...

q519306079的博客 1112

C#远程调用实现案例

 C#实现远程调用主要用到“System.Runtime.Remoting”这个东西。下面从三个方面给于源码实例。·服务端:using System.Runtime.Remoting.Channels;using System.Runtime.Remoting.Channels.Tcp;using System.Runtime.Remoting;namespace RemoteSamp

PMP-DoNET 7376

C# Remoting Demo

什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。Microsoft .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程

小铭的命名空间 1914

C# Remoting 简单实现

今天对C# Remoting进行了初步的学习,废话不说... RemotingModel: Talker.cs using System; using System.Collections.Generic; using System.Text; namespace RemotingModel {     ///     ///     ///    publ

u011555996的博客 7289

WebSharper Remoting实战指南:如何用一个Remote标注实现零样板的异步调用

**WebSharper** 是一个用于构建全栈(Full-stack)、函数式、响应式 Web 应用的 .NET 框架,支持 F# 和 C#。它的 **Remoting** 机制堪称"零样板远程调用"的典范:你只需在服务端函数上加一个 `<Remote>` 标注,浏览器端就能像调用本地函数一样发起异步请求——序列化、HTTP 传输、CSRF 防护、响应反序列化,全部由框架自动完成 🚀 ##

gitblog_00018的博客 325
上一篇: 初入职场工作上的那点事儿
下一篇: 从学生到程序员
疯疯爱吃辣
博客等级 码龄15年 25粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值