• 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 调用其他进程

  • 相关阅读:
    <hdu2072>单词数(set容器,string类应用)
    志愿者选拔
    Game of Life
    <LightOJ 1338> Hidden Secret!
    Miss Kitty and Her Little Ice Cream Shop(水题)
    约瑟夫问题
    <FZU 1019>猫捉老鼠
    <cf>System of Equations(水题)
    Palindromic Numbers (III)(回文数,较麻烦)
    <cf>Solitaire(DFS or DP)
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086209.html
Copyright © 2020-2023  润新知