国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

WPF利用RPC調(diào)用其他進程的方法詳解

2020-01-24 00:17:55
字體:
供稿:網(wǎng)友

前言

如果在 WPF 需要用多進程通信,一個推薦的方法是 WCF ,因為 WCF 是 RPC 計算。先來講下 RPC (Remote Procedure Call) 遠程過程調(diào)用,他是通過特定協(xié)議,包括 tcp 、http 等對其他進程進行調(diào)用的技術。詳細請看百度

現(xiàn)在不會告訴大家如何使用 WCF ,下面講的是使用 remoting 這個方法。需要知道 dotnet remoting 是已經(jīng)過時的技術,建議使用 wcf 但是 wcf 部署難度比較高,對于性能要求比較高或想快速使用,建議使用 remoting 。使用方法很簡單

首先創(chuàng)建三個工程,一個工程放其他兩個需要使用的庫,一個是服務端,一個是客戶端。其中客戶端就可以調(diào)用服務端,客戶端和服務端是兩個不同的進程,所以可以跨進程調(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)用這個類的方法在服務端運行,結果通過 tcp 或 http 返回。

客戶端的主要代碼是連接服務端,然后訪問庫的 add 函數(shù),但是這個函數(shù)不在客戶端運行,通過 tcp 調(diào)用服務端,讓他運行。

  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 ,主要是打開連接,執(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;

需要注意,客戶端點擊按鈕需要先打開服務端,使用這個代碼Process.Start("CalcnsMnlhzydYeuiitcCddhxvlhm.exe");然后創(chuàng)建 tcp 告訴通過tcp和服務端連接。然后從服務端獲得 calculator 這個類,實際這個類現(xiàn)在是沒有實現(xiàn),調(diào)用函數(shù)需要發(fā)送到服務端。

服務端需要打開 TcpChannel ,這時需要定義調(diào)用的類,RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteCalculator), "RemoteCalculator", WellKnownObjectMode.Singleton); ,這個函數(shù)的一個參數(shù)就是注冊的類,第二個函數(shù)是調(diào)用的這個類使用什么名稱,一般都是使用類的名稱,最后一個參數(shù)可以在一個連接給一個實例。所以在庫的類不能在構造函數(shù)需要傳入

客戶端調(diào)用的"tcp://" + "127.0.0.1" + ":" + RemoteCalculator.Port + "/RemoteCalculator"最后一個RemoteCalculator就是服務端注冊的第二個函數(shù)。

那么這個功能的作用是什么?因為 x64 程序不能調(diào)用 x86 的庫,所以可以用這個方法在 x64 的程序調(diào)用其他平臺的庫,因為進程運行的平臺不一樣,但是通信是相同。

其他的功能我沒有使用,我就使用打開服務,調(diào)用他的函數(shù),所以如果大家遇到問題,不要來問我。如果按照我的代碼無法運行,可以發(fā)郵件給我,我發(fā)源代碼給你

代碼下載:點擊這里

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 洪泽县| 东明县| 博湖县| 旬邑县| 会昌县| 呼玛县| 凯里市| 龙泉市| 永德县| 五莲县| 富民县| 昌吉市| 砚山县| 青铜峡市| 华阴市| 新龙县| 简阳市| 云安县| 高邮市| 东海县| 睢宁县| 榆社县| 凌云县| 三河市| 弥勒县| 稷山县| 新泰市| 元阳县| 高要市| 广河县| 曲沃县| 垦利县| 潍坊市| 焦作市| 泰兴市| 定边县| 荃湾区| 哈巴河县| 乐平市| 南充市| 兴海县|