WPF利用RPC調(diào)用其他進程的方法詳解
前言
如果在 WPF 需要用多進程通信,一個推薦的方法是 WCF ,因為 WCF 是 RPC 計算。先來講下 RPC (Remote Procedure Call) 遠程過程調(diào)用,他是通過特定協(xié)議,包括 tcp 、http 等對其他進程進行調(diào)用的技術(shù)。詳細請看百度
現(xiàn)在不會告訴大家如何使用 WCF ,下面講的是使用 remoting 這個方法。需要知道 dotnet remoting 是已經(jīng)過時的技術(shù),建議使用 wcf 但是 wcf 部署難度比較高,對于性能要求比較高或想快速使用,建議使用 remoting 。使用方法很簡單
首先創(chuàng)建三個工程,一個工程放其他兩個需要使用的庫,一個是服務(wù)端,一個是客戶端。其中客戶端就可以調(diào)用服務(wù)端,客戶端和服務(wù)端是兩個不同的進程,所以可以跨進程調(diào)用。
方法如下:
先創(chuàng)建一個簡單的工程,庫的工程 RemoteObject ,里面只有一個類
public class RemoteCalculator : MarshalByRefObject { public const int Port = 13570; public int Add(int a, int b) { return a + b; } }
注意這個類需要繼承 MarshalByRefObject ,這個類是在兩個進程引用,客戶端不實現(xiàn)這個類,所以客戶端使用這個類接口同樣可以。具體調(diào)用這個類的方法在服務(wù)端運行,結(jié)果通過 tcp 或 http 返回。
客戶端的主要代碼是連接服務(wù)端,然后訪問庫的 add 函數(shù),但是這個函數(shù)不在客戶端運行,通過 tcp 調(diào)用服務(wù)端,讓他運行。
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)); }
服務(wù)端的名稱是 CalcnsMnlhzydYeuiitcCddhxvlhm ,主要是打開連接,執(zhí)行客戶端發(fā)過來的函數(shù)
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;
需要注意,客戶端點擊按鈕需要先打開服務(wù)端,使用這個代碼Process.Start("CalcnsMnlhzydYeuiitcCddhxvlhm.exe");然后創(chuàng)建 tcp 告訴通過tcp和服務(wù)端連接。然后從服務(wù)端獲得 calculator 這個類,實際這個類現(xiàn)在是沒有實現(xiàn),調(diào)用函數(shù)需要發(fā)送到服務(wù)端。
服務(wù)端需要打開 TcpChannel ,這時需要定義調(diào)用的類,RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteCalculator), "RemoteCalculator", WellKnownObjectMode.Singleton);
,這個函數(shù)的一個參數(shù)就是注冊的類,第二個函數(shù)是調(diào)用的這個類使用什么名稱,一般都是使用類的名稱,最后一個參數(shù)可以在一個連接給一個實例。所以在庫的類不能在構(gòu)造函數(shù)需要傳入
客戶端調(diào)用的"tcp://" + "127.0.0.1" + ":" + RemoteCalculator.Port + "/RemoteCalculator"最后一個RemoteCalculator就是服務(wù)端注冊的第二個函數(shù)。
那么這個功能的作用是什么?因為 x64 程序不能調(diào)用 x86 的庫,所以可以用這個方法在 x64 的程序調(diào)用其他平臺的庫,因為進程運行的平臺不一樣,但是通信是相同。
其他的功能我沒有使用,我就使用打開服務(wù),調(diào)用他的函數(shù),所以如果大家遇到問題,不要來問我。如果按照我的代碼無法運行,可以發(fā)郵件給我,我發(fā)源代碼給你
代碼下載:點擊這里
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支持。
欄 目:C#教程
下一篇:C#判斷一個字符串是否是數(shù)字或者含有某個數(shù)字的方法
本文標題:WPF利用RPC調(diào)用其他進程的方法詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5159.html
您可能感興趣的文章
- 01-10C#利用反射技術(shù)實現(xiàn)去掉按鈕選中時的邊框效果
- 01-10C#及WPF獲取本機所有字體和顏色的方法
- 01-10WPF實現(xiàn)類似360安全衛(wèi)士界面的程序源碼分享
- 01-10C#圖片處理3種高級應(yīng)用
- 01-10WPF實現(xiàn)時鐘特效
- 01-10超炫酷的WPF實現(xiàn)Loading控件效果
- 01-10C#異步下載文件
- 01-10C# Console利用mspaint打開圖像并保存的方法
- 01-10C#利用delegate實現(xiàn)Javascript的each方法
- 01-10C#利用GDI繪制常見圖形和文字


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什