如何在.NET EXE和COM EXE之间进行通信?

时间:2010-01-08 06:57:06

标签: c# .net windows-mobile multithreading process

我在Windows Mobile中有一个.NET EXE和ATL COM EXE。我需要在他们之间进行沟通。 即我的ATL EXE启动.NET EXE。 .NET EXE应向ATL EXE发送一条消息,表明处理已完成或已退出。我怎么能这样做?

如何在两个独立的流程之间进行沟通?

4 个答案:

答案 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)。