日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# 兩個exe程序之間通信

admin
2024年10月24日 11:27 本文熱度 1224

在C# WPF開發(fā)中,內存泄漏是一個常見且棘手的問題。內存泄漏會導致應用程序隨著時間的推移消耗越來越多的內存,最終可能導致應用程序崩潰或者系統(tǒng)性能下降。以下是一些常見的內存泄漏原因以及相應的排查和解決方法。

1. 事件訂閱

在 C# 中,實現(xiàn)兩個獨立執(zhí)行程序(EXE)之間的通信是一個常見的需求。這種通信可以通過多種方式實現(xiàn),包括但不限于命名管道、匿名管道、消息隊列、內存映射文件、套接字(Sockets)以及使用 Windows API 如 SendMessage 等。本文將介紹幾種常用的方法,并提供示例代碼。

1. 使用命名管道進行通信

命名管道是一種常用的進程間通信(IPC)機制,允許不同進程之間進行雙向通信。

服務端示例代碼

using System;
using System.IO.Pipes;
using System.Text;

public class NamedPipeServer
{
   public static void Main()
   {
       using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut))
       {
           Console.WriteLine("Waiting for client connection...");
           pipeServer.WaitForConnection();
           
           using (var reader = new StreamReader(pipeServer))
           using (var writer = new StreamWriter(pipeServer))
           {
               writer.WriteLine("Hello from server");
               writer.Flush();
               string message = reader.ReadLine();
               Console.WriteLine("Received from client: " + message);
           }
       }
   }
}

客戶端示例代碼

using System;
using System.IO.Pipes;
using System.Text;

public class NamedPipeClient
{
   public static void Main()
   {
       using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "testpipe", PipeDirection.InOut))
       {
           Console.WriteLine("Connecting to server...");
           pipeClient.Connect();
           
           using (var reader = new StreamReader(pipeClient))
           using (var writer = new StreamWriter(pipeClient))
           {
               string message = reader.ReadLine();
               Console.WriteLine("Received from server: " + message);
               writer.WriteLine("Hello from client");
               writer.Flush();
           }
       }
   }
}

2. 使用匿名管道進行通信

匿名管道是另一種 IPC 機制,通常用于父子進程之間的通信。

服務端示例代碼

using System;
using System.IO.Pipes;

public class AnonymousPipeServer
{
   public static void Main()
   {
       using (AnonymousPipeServerStream pipeServer = new AnonymousPipeServerStream(PipeDirection.Out))
       {
           Console.WriteLine("Writing to client...");
           pipeServer.Write(new byte[] { 0x01, 0x02, 0x03, 0x04 }, 0, 4);
       }
   }
}

客戶端示例代碼

using System;
using System.IO.Pipes;

public class AnonymousPipeClient
{
   public static void Main()
   {
       using (AnonymousPipeClientStream pipeClient = new AnonymousPipeClientStream(PipeDirection.In))
       {
           AnonymousPipeServerStream pipeServer = new AnonymousPipeServerStream(PipeDirection.Out, pipeClient);
           pipeServer.DisposeLocalCopyOfClientHandle();
           byte[] buffer = new byte[4];
           int bytesRead = pipeClient.Read(buffer, 0, 4);
           Console.WriteLine("Read {0} bytes from server.", bytesRead);
       }
   }
}

3. 使用 SendMessage 實現(xiàn)通信

SendMessage 是一個 Windows API 函數(shù),可以用來在兩個獨立的 EXE 程序之間發(fā)送消息。

發(fā)送端示例代碼

using System;
using System.Runtime.InteropServices;

public class SendMessageSender
{
   public const int WM_COPYDATA = 0x004A;

   [DllImport("User32.dll", EntryPoint = "FindWindow")]
   private static extern int FindWindow(string lpClassName, string lpWindowName);

   [DllImport("User32.dll", EntryPoint = "SendMessage")]
   private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);

   public struct COPYDATASTRUCT
   {
       public IntPtr dwData;
       public int cbData;
       [MarshalAs(UnmanagedType.LPStr)]
       public string lpData;
   }

   public static void Main()
   {
       string message = "Hello from Sender";
       COPYDATASTRUCT cds;
       cds.dwData = IntPtr.Zero;
       cds.cbData = message.Length + 1;
       cds.lpData = message;

       int hwnd = FindWindow(null, "Receiver Window Title");
       SendMessage(hwnd, WM_COPYDATA, 0, ref cds);
   }
}

接收端示例代碼

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class SendMessageReceiver : Form
{
   public const int WM_COPYDATA = 0x004A;

   public SendMessageReceiver()
   {
       // Set up the main window...
   }

   protected override void WndProc(ref Message m)
   {
       if (m.Msg == WM_COPYDATA)
       {
           COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));
           string text = Marshal.PtrToStringAnsi(cds.lpData, cds.cbData - 1);
           MessageBox.Show(text);
       }
       base.WndProc(ref m);
   }

   public static void Main()
   {
       Application.Run(new SendMessageReceiver());
   }
}

結論

以上介紹了幾種在 C# 中實現(xiàn)兩個 EXE 程序之間通信的方法。每種方法都有其適用場景和優(yōu)缺點。命名管道適用于需要全雙工通信的場景,匿名管道適用于父子進程間的通信,而 SendMessage 則適用于簡單的數(shù)據(jù)傳遞。開發(fā)者可以根據(jù)具體需求選擇合適的通信方式。


該文章在 2024/10/28 16:33:17 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結合碼頭的業(yè)務特點,圍繞調度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

欧美huangpian免费| 亚洲天堂精品久久网站| 欧美一级A∨| 人妻黄色电影网站| 日韩一区欧美图片| 日韩色情电影图片小说在线免费观看| 韩国台湾一区二区三区| 欧美v一类黄片| 99国产精品18久久久久久白浆| 无码人妻一区二区三区中文字幕| 久9久久久精品| 亚洲色大网站www永久网站| 少妇插入| 日韩在线图片一区二区三区| 亚洲一区自拍偷拍国产精品| www.三级久久| 91视频,熟女| 少妇久久视频| 一区二区三区免费观看精品久久久| 日本五十路熟女完整视频| 久久久黄色小说网站| 亚州欧美偷窥自拍| 九九热免费视频观看| 性爱99怀旧| 俄罗斯操逼视| 欧美 日韩 一区二区 高清 在线| 午液少妇久久久久久久久| 大鸡巴插满av| 午夜AV电影网| 2020无码在线| av免费观看三区| a∨精品一区二| 乱系列久久| 国产一区在线看| 精品人妻一区二区三区线曰卧| 九九热无码| 色停停国产在线| 色桃AV| 国产剧情中文色呦呦呦| 在线 黄色av| 1024日韩一区|