我有兩個exe文件正在運行,c#console程序。從一個,我需要告訴第二個exe做什麼?怎麼樣... ?我看着將消息傳遞給exe文件中的另一個exe文件#
(Remotable.CommonAssembly)Activator.GetObject(typeof(Remotable.CommonAssembly)
,但在這裏,我可以調用CommonAssembly(參考DLL)的方法不是一個exe文件的。
我有兩個exe文件正在運行,c#console程序。從一個,我需要告訴第二個exe做什麼?怎麼樣... ?我看着將消息傳遞給exe文件中的另一個exe文件#
(Remotable.CommonAssembly)Activator.GetObject(typeof(Remotable.CommonAssembly)
,但在這裏,我可以調用CommonAssembly(參考DLL)的方法不是一個exe文件的。
在.NET中查看WCF的進程間通信。有多種協議可用於同機或遠程機器通信。對於同一臺機器,我建議檢出命名管道或.NET TCP綁定。
WCF有一個輕微的學習曲線,但有很多的教程,這是絕對值得學習的。
對於簡單的場景一個普通的舊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類。
如果你有更復雜的通信協議和不同的動作觸發,返回值等,WCF,Remoting,DCOM,CORBA等高級IPC機制可能會更好。對於簡單的情況(一對夫婦)的Windows事件就足夠了。
注意事項 如果您需要在您的進程之間傳輸數據,請考慮內存映射文件。 「官方」.NET類將爲.NET 4.0提供,目前您可以使用http://github.com/tomasr/filemap/tree/master
您可能會考慮IPC。 NamedPipeClientStream和NamedPipeServerStream非常簡單。 Here's an example其中IPC用於將命令行參數從應用程序的一個實例傳遞到另一個實例。這不完全是你想要做的,但非常接近。
這應該對你有用......
[代碼]
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);
[/代碼]
WCF能爲你做的工作。 – Irwin 2009-06-06 23:43:07