我在Windows Mobile中有一个.NET EXE和ATL COM EXE。我需要在他们之间进行沟通。 即我的ATL EXE启动.NET EXE。 .NET EXE应向ATL EXE发送一条消息,表明处理已完成或已退出。我怎么能这样做?
如何在两个独立的流程之间进行沟通?
答案 0 :(得分:1)
修改强>
错过了关于移动设备的问题。不知道这是否有效。
我在这个辅助类中使用了IPC通道:
static class IpcChannelManager<T> {
/// <summary>
/// Make a type available to other processess
/// </summary>
/// <param name="type">
/// Type to register, must derive from MarshalByRefObject and implement <typeparamref name="T"/>
/// </param>
/// <param name="portName">Name of IpcChannel</param>
public static void RegisterType(Type type, string portName) {
if (!type.IsSubclassOf(typeof(MarshalByRefObject)))
throw new ArgumentException("Registered type must derive from MarshalByRefObject");
Dictionary<string, string> ipcproperties = new Dictionary<string, string>();
ipcproperties["portName"] = portName;
// Get the localized name of the "Authenticated users" group
ipcproperties["authorizedGroup"] = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null).Translate(typeof(NTAccount)).ToString();
ChannelServices.RegisterChannel(new IpcServerChannel(ipcproperties, null), false);
RemotingConfiguration.RegisterWellKnownServiceType(type, typeof(T).Name, WellKnownObjectMode.Singleton);
}
/// <summary>
/// Get a reference to a remoting object
/// </summary>
/// <param name="portName">Name of Ipc port</param>
/// <returns>
/// Reference to remote server object</returns>
public static T GetRemoteProxy(string portName) {
ChannelServices.RegisterChannel(new IpcClientChannel(), false);
return (T)Activator.GetObject(typeof(T), "ipc://" + portName + "/" + typeof(T).Name);
}
然后我就这样使用它:
双方可用的界面
interface IIpcMessage {
int GetSomeData(string foo);
}
在接收端我做
class IpcMessage : MarshalByRefObject, IIpcMessage {
...
}
IpcChannelManager<IIpcMessage>.RegisterType(typeof(IpcMessage), "Someuniqueportname");
在发件人端:
IIpcMessage ipcMessage = IpcChannelManager<IIpcMessage>.GetRemoteProxy("Someuniqueportname");
int data = ipcMessage.GetSomeDate("blabla");
答案 1 :(得分:1)
CreateProcess可以返回进程句柄。您只需要在其上执行WaitForSinbleObject,它将在.NET进程退出时发出信号。
答案 2 :(得分:0)
您可以使用Windows消息。有关详细信息,请参阅此blog post。
答案 3 :(得分:0)
使用点对点消息队列(请参阅CreateMsgQueue API)。