zoukankan      html  css  js  c++  java
  • 2018-6-24-WPF-使用RPC调用其他进程

    title author date CreateTime categories
    WPF 使用RPC调用其他进程
    lindexi
    2018-06-24 14:41:29 +0800
    2018-2-13 17:23:3 +0800
    dotnetremoting rpc WPF

    如果在 WPF 需要用多进程通信,一个推荐的方法是 WCF ,因为 WCF 是 RPC 计算。先来讲下 RPC (Remote Procedure Call) 远程过程调用,他是通过特定协议,包括 tcp 、http 等对其他进程进行调用的技术。详细请看百度

    现在不会告诉大家如何使用 WCF ,下面讲的是使用 remoting 这个方法。需要知道 dotnet remoting 是已经过时的技术,建议使用 wcf 但是 wcf 部署难度比较高,对于性能要求比较高或想快速使用,建议使用 remoting 。使用方法很简单

    如果不想知道具体是怎么做,只想使用,那么请看WPF 封装 dotnet remoting 调用其他进程,欢迎加入dotnet 职业学院任何问题都可以在群里交流

    首先创建三个工程,一个工程放其他两个需要使用的库,一个是服务端,一个是客户端。其中客户端就可以调用服务端,客户端和服务端是两个不同的进程,所以可以跨进程调用。

    先创建一个简单的工程,库的工程 RemoteObject ,里面只有一个类

      public class RemoteCalculator : MarshalByRefObject
        {
            public const int Port = 13570;
    
            public int Add(int a, int b)
            {
                return a + b;
            }
        }

    注意这个类需要继承 MarshalByRefObject ,这个类是在两个进程引用,客户端不实现这个类,所以客户端使用这个类接口同样可以。具体调用这个类的方法在服务端运行,结果通过 tcp 或 http 返回。

    客户端的主要代码是连接服务端,然后访问库的 add 函数,但是这个函数不在客户端运行,通过 tcp 调用服务端,让他运行。

           private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
            {
                if (_channel == null)
                {
                    Process.Start("CalcnsMnlhzydYeuiitcCddhxvlhm.exe");
                    _channel = new TcpChannel();
                    ChannelServices.RegisterChannel(_channel, true);
                }
                var calculator = (RemoteCalculator) Activator.GetObject(typeof(RemoteCalculator),
                    "tcp://" + "127.0.0.1" + ":" + RemoteCalculator.Port + "/RemoteCalculator");
                Console.WriteLine(calculator.Add(1, 2));
            }

    服务端的名称是 CalcnsMnlhzydYeuiitcCddhxvlhm ,主要是打开连接,执行客户端发过来的函数

            static void Main(string[] args)
            {
                new Thread(() =>
                {
                    _channel = new TcpChannel(RemoteCalculator.Port);
    
                    ChannelServices.RegisterChannel(_channel, true);
                    RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteCalculator), "RemoteCalculator", WellKnownObjectMode.Singleton);
                }).Start();
                while (true)
                {
                    Console.ReadKey();
                }
            }
    
            private static TcpChannel _channel;

    需要注意,客户端点击按钮需要先打开服务端,使用这个代码Process.Start("CalcnsMnlhzydYeuiitcCddhxvlhm.exe");然后创建 tcp 告诉通过tcp和服务端连接。然后从服务端获得 calculator 这个类,实际这个类现在是没有实现,调用函数需要发送到服务端。

    服务端需要打开 TcpChannel ,这时需要定义调用的类,RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteCalculator), "RemoteCalculator", WellKnownObjectMode.Singleton);,这个函数的一个参数就是注册的类,第二个函数是调用的这个类使用什么名称,一般都是使用类的名称,最后一个参数可以在一个连接给一个实例。所以在库的类不能在构造函数需要传入

    客户端调用的"tcp://" + "127.0.0.1" + ":" + RemoteCalculator.Port + "/RemoteCalculator"最后一个RemoteCalculator就是服务端注册的第二个函数。

    那么这个功能的作用是什么?因为 x64 程序不能调用 x86 的库,所以可以用这个方法在 x64 的程序调用其他平台的库,因为进程运行的平台不一样,但是通信是相同。

    其他的功能我没有使用,我就使用打开服务,调用他的函数,所以如果大家遇到问题,不要来问我。如果按照我的代码无法运行,可以发邮件给我,我发源代码给你

    代码下载:网盘

    更多关于 WPF dotnet remoting RPC 的博客请看

    .net remoting 使用事件

    .net remoting 抛出异常

    如果不想知道那么多,想要快速开始,请看

    WPF 封装 dotnet remoting 调用其他进程

  • 相关阅读:
    Centos7安装go.10.1环境
    centos7安装PHP5
    Linux 无文件攻击memfd_create()具体操作步骤
    centos7 '/mnt/hgfs'下共享文件夹不显示问题
    fiddler连接代理手机无法上网问题解决办法
    centos 镜像软件安装包版本低,手动安装过程
    0 upgraded, 0 newly installed, 0 to remove and 112 not upgraded解决方法
    JavaScript高级程序设计(第3版)第七章读书笔记
    JavaScript高级程序设计(第3版)第六章读书笔记
    JavaScript高级程序设计(第3版)第五章读书笔记
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086210.html
Copyright © 2011-2022 走看看