如何从管道发送和接收

时间:2015-01-15 15:47:26

标签: c# named-pipes

我有一个c#winform app。

我也有一个c#DLL。

DLL以32位格式编译。 GUI使用64位格式编译。

我正在使用管道来实现两种不同编辑之间的混乱。

DLL(客户端)向我的GUI(服务器)发送一个字节数组图像。

这是我的服务器代码:

public partial class Form1 : Form
    {
        public delegate void NewMessageDelegate(System.Drawing.Bitmap NewMessage);
        private PipeServer pipeName;

    public Form1()
    {
        InitializeComponent();
        pipeName = new PipeServer();
        pipeName.PipeMessage += new DelegateMessage(PipesMessageHandler);
    }

    private void cmdListen_Click(object sender, EventArgs e)
    {
        try
        {
            pipeName.Listen("TestPipe");               
            txtMessage.Text = "Listening - OK";
            cmdListen.Enabled = false;
        }
        catch (Exception)
        {
            txtMessage.Text = "Error Listening";
        }            
    } 

    private void PipesMessageHandler(System.Drawing.Bitmap message)
    {
        try
        {

            if (this.InvokeRequired)
            {
                pictureBox1.Invoke((MethodInvoker)(() => pictureBox1.Image = message));
            }
            else
            {
                pictureBox1.Image = message;
            }
        }
        catch (Exception ex)
        {

            Debug.WriteLine(ex.Message);
        }

    }
}

因此,用户将按下我的cmdListen'按钮。

这是我的客户端代码(在DLL中):

class PipeClient
{
    public void Send(Bitmap frame, string PipeName, int TimeOut = 1000)
    {
        try
        {
            NamedPipeClientStream pipeStream = new NamedPipeClientStream(".", PipeName, PipeDirection.Out, PipeOptions.Asynchronous);
            pipeStream.Connect(TimeOut);
            Debug.WriteLine("[Client] Pipe connection established");
            byte[] _buffer = null;
            using (var ms = new MemoryStream())
            {
                frame.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                _buffer = ms.ToArray();
            }
            pipeStream.BeginWrite(_buffer, 0, _buffer.Length, AsyncSend, pipeStream);
        }
        catch (TimeoutException oEX)
        {
            Debug.WriteLine(oEX.Message);
        }
    }

    private void AsyncSend(IAsyncResult iar)
    {
        try
        {
            // Get the pipe
            NamedPipeClientStream pipeStream = (NamedPipeClientStream)iar.AsyncState;
            // End the write
            pipeStream.EndWrite(iar);
            pipeStream.Flush();
            pipeStream.Close();
            pipeStream.Dispose();
        }
        catch (Exception oEX)
        {
            Debug.WriteLine(oEX.Message);
        }
    }
}

发送'由我的DLL中的计时器调用来“泵”#图像到我的GUI应用程序。

这一切都有效。

我需要添加/做的是在触发计时器之前将一些参数从服务器(GUI)传递到我的DLL(客户端)。

所以,在我的客户端DLL中我会有这个功能(例如)

public void InitDLL(object[] args)
{
    //do something with these parameters
    //start timer off
}

那么,如何使用Pipes从我的GUI调用此函数?

我注意到PipeDirection可以设置为InOut。但我不确定如何简单地将一些代码添加到我的服务器应用程序以向我的客户端发送消息。

0 个答案:

没有答案