WPF 使用RPC調用其餘進程

若是在 WPF 須要用多進程通訊,一個推薦的方法是 WCF ,由於 WCF 是 RPC 計算。先來說下 RPC (Remote Procedure Call) 遠程過程調用,他是經過特定協議,包括 tcp 、http 等對其餘進程進行調用的技術。詳細請看百度php

如今不會告訴你們如何使用 WCF ,下面講的是使用 remoting 這個方法。須要知道 dotnet remoting 是已通過時的技術,建議使用 wcf 可是 wcf 部署難度比較高,對於性能要求比較高或想快速使用,建議使用 remoting 。使用方法很簡單html

若是不想知道具體是怎麼作,只想使用,那麼請看WPF 封裝 dotnet remoting 調用其餘進程,歡迎加入dotnet 職業學院任何問題均可以在羣裏交流git

首先建立三個工程,一個工程放其餘兩個須要使用的庫,一個是服務端,一個是客戶端。其中客戶端就能夠調用服務端,客戶端和服務端是兩個不一樣的進程,因此能夠跨進程調用。tcp

先建立一個簡單的工程,庫的工程 RemoteObject ,裏面只有一個類函數

public class RemoteCalculator : MarshalByRefObject
    {
        public const int Port = 13570;

        public int Add(int a, int b)
        {
            return a + b;
        }
    }

注意這個類須要繼承 MarshalByRefObject ,這個類是在兩個進程引用,客戶端不實現這個類,因此客戶端使用這個類接口一樣能夠。具體調用這個類的方法在服務端運行,結果經過 tcp 或 http 返回。post

客戶端的主要代碼是鏈接服務端,而後訪問庫的 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 ,主要是打開鏈接,執行客戶端發過來的函數ui

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 這個類,實際這個類如今是沒有實現,調用函數須要發送到服務端。.net

服務端須要打開 TcpChannel ,這時須要定義調用的類,RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteCalculator), "RemoteCalculator", WellKnownObjectMode.Singleton);,這個函數的一個參數就是註冊的類,第二個函數是調用的這個類使用什麼名稱,通常都是使用類的名稱,最後一個參數能夠在一個鏈接給一個實例。因此在庫的類不能在構造函數須要傳入code

客戶端調用的"tcp://" + "127.0.0.1" + ":" + RemoteCalculator.Port + "/RemoteCalculator"最後一個RemoteCalculator就是服務端註冊的第二個函數。

那麼這個功能的做用是什麼?由於 x64 程序不能調用 x86 的庫,因此能夠用這個方法在 x64 的程序調用其餘平臺的庫,由於進程運行的平臺不同,可是通訊是相同。

其餘的功能我沒有使用,我就使用打開服務,調用他的函數,因此若是你們遇到問題,不要來問我。若是按照個人代碼沒法運行,能夠發郵件給我,我發源代碼給你

代碼下載:網盤

更多關於 WPF dotnet remoting RPC 的博客請看

.net remoting 使用事件

.net remoting 拋出異常

若是不想知道那麼多,想要快速開始,請看

WPF 封裝 dotnet remoting 調用其餘進程

我搭建了本身的博客 https://lindexi.gitee.io/ 歡迎你們訪問,裏面有不少新的博客。只有在我看到博客寫成熟以後纔會放在csdn或博客園,可是一旦發佈了就再也不更新

若是在博客看到有任何不懂的,歡迎交流,我搭建了 dotnet 職業技術學院 歡迎你們加入

知識共享許可協議
本做品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、從新發布,但務必保留文章署名林德熙(包含連接:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的做品務必以相同的許可發佈。若有任何疑問,請與我聯繫

相關文章
相關標籤/搜索