2009-06-06 79 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); 

[/代碼]