2009-06-06 82 views
4

我有两个exe文件正在运行,c#console程序。从一个,我需要告诉第二个exe做什么?怎么样... ?我看着将消息传递给exe文件中的另一个exe文件#

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

,但在这里,我可以调用CommonAssembly(参考DLL)的方法不是一个exe文件的。

回答

3

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

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

+0

WCF能为你做的工作。 – Irwin 2009-06-06 23:43:07

5

对于简单的场景一个普通的旧Windows事件就足够了 - 一个程序等待发出信号做一些事情。

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

//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或更高版本上运行。
  • 创建事件时,您可能需要设置安全属性,以便可以从其他会话的其他进程打开安全属性。

如果你有更复杂的通信协议和不同的动作触发,返回值等,WCF,Remoting,DCOM,CORBA等高级IPC机制可能会更好。对于简单的情况(一对夫妇)的Windows事件就足够了。

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

+0

有趣,不知道内存映射文件将在.NET 4.0中受支持 – RichardOD 2009-06-06 23:45:14

+1

您可以通过以下网址查看文档: http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles(VS。 100)的.aspx – devdimi 2009-06-07 12:07:49

2

这应该对你有用......

[代码]

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); 

[/代码]