繁体   English   中英

将消息传递给exe C#中的另一个exe

[英]Pass a message to another exe from an exe C#

我有两个exe运行的C#控制台程序。 从一个,我需要告诉第二个exe做某事? 我怎样才能做到这一点? 我看着

(Remotable.CommonAssembly)Activator.GetObject(typeof(Remotable.CommonAssembly)

但是从这里我可以调用CommonAssembly(引用的dll)的方法而不是exe的方法。

对于简单的场景,一个普通的旧窗口事件就足够了 - 一个程序等待发出信号来做某事。

在等待事件的等待程序中生成一个线程。

//Program 1

EventWaitHandle evt = OpenOrCreateEvent("Global\\MyEvent");
evt.WaitOne(); // this thread will block waiting without wasting CPU cycles, 
               // it will be be signaled from the kernel 
               // when the event is set
DoStuff();


//Program 2

EventWaitHandle evt = OpenOrCreateEvent("Global\\MyEvent");
evt.Set();

看一下EventWaitHandle,ManualResetEvent,AutoResetEvent类。

  • 考虑要创建事件的程序 - 您可以尝试从两个程序中打开事件,如果它不存在而不是创建它。
  • 如果其中一个程序是服务(和/或在其他会话/用户中运行),则使用“全局”前缀事件名称。 否则它将无法在Vista或更高版本上运行。
  • 创建事件时,您可能需要设置安全属性,以便可以从其他会话中的其他进程打开它。

如果您有更复杂的通信协议以及不同的触发操作,返回值等,那么高级IPC机制(如WCF,Remoting,DCOM,CORBA等)可能会更好。 对于简单的情况(一对)窗口事件就足够了。

注意如果需要在进程间传输数据,请考虑内存映射文件。 .NET 4.0将提供“官方”.NET类,目前可以使用http://github.com/tomasr/filemap/tree/master

查看WCF以了解.NET中的进程间通信。 有多种协议可用于同一台机器或远程机器通信。 对于同一台机器,我建议检查命名管道或.NET TCP绑定。

WCF有一个轻微的学习曲线,但有很多教程,这是绝对值得学习的东西。

这应该为你做的伎俩......

[码]

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace TestApp
{
public static class Messenger
{
    public const uint WM_USER = 0x0400;

    public const int MyMessage = 0x00000001;;

    [DllImport("User32.dll")]
    private static extern int RegisterWindowMessage(string lpString);

    [DllImport("User32.dll", EntryPoint = "FindWindow")]
    internal static extern IntPtr FindWindow(String lpClassName, String lpWindowName);

    //For use with WM_COPYDATA and COPYDATASTRUCT
    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    internal static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);

    //For use with WM_COPYDATA and COPYDATASTRUCT
    [DllImport("User32.dll", EntryPoint = "PostMessage")]
    internal static extern int PostMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);

    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    internal static extern uint SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, int lParam);

    [DllImport("User32.dll", EntryPoint = "PostMessage")]
    internal static extern int PostMessage(int hWnd, int Msg, int wParam, int lParam);

    [DllImport("User32.dll", EntryPoint = "SetForegroundWindow")]
    internal static extern bool SetForegroundWindow(int hWnd);


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


    internal static int sendWindowsStringMessage(int hWnd, int wParam, string msg)
    {
        int result = 0;

        if (hWnd > 0)
        {
            byte[] sarr = System.Text.Encoding.Default.GetBytes(msg);
            int len = sarr.Length;
            COPYDATASTRUCT cds;
            cds.dwData = (IntPtr)100;
            cds.lpData = msg;
            cds.cbData = len + 1;
            result = SendMessage(hWnd, (int)WM_USER, wParam, ref cds);
        }

        return result;
    }

    internal static uint sendWindowsMessage(IntPtr hWnd, uint Msg, IntPtr wParam, int lParam)
    {
        uint result = 0;

        if (hWnd != IntPtr.Zero)
        {
            result = SendMessage(hWnd, Msg, wParam, lParam);
        }

        return result;
    }

    internal static IntPtr getWindowId(string className, string windowName)
    {
        return FindWindow(className, windowName);
    }
}

}

在你的调用方法中:

uint result = 0;
IntPtr hWnd = Messenger.getWindowId(null, "MyOtherApp-Window_Title");
result = Messenger.sendWindowsMessage(hWnd, Messenger.WM_USER, Handle, Messenger.MyMessage);

[/码]

你可能会考虑IPC。 NamedPipeClientStreamNamedPipeServerStream非常简单。 这是一个使用IPC将命令行参数从一个应用程序实例传递到另一个实例的示例。 这不完全是你想要做的,但非常接近。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM