Как связаться между .NET EXE и COM EXE? - PullRequest
0 голосов
/ 08 января 2010

У меня есть .NET EXE и ATL COM EXE в Windows Mobile . Мне нужно общаться между ними. Т.е. мой ATL EXE запускает .NET EXE. .NET EXE должен отправить сообщение в ATL EXE, что обработка завершена или завершена. Как я могу это сделать?

Как общаться между двумя отдельными процессами?

Ответы [ 4 ]

1 голос
/ 08 января 2010

Изменить:

Пропустил, что вопрос был о мобильном. Не знаю, работает ли это.

Я использую канал 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 голос
/ 08 января 2010

CreateProcess может возвращать дескриптор процесса. Все, что вам нужно сделать, это WaitForSinbleObject на нем, он будет сигнализироваться при выходе из .NET-процесса.

0 голосов
/ 08 января 2010

Использование двухточечной очереди сообщений (см. CreateMsgQueue API ).

0 голосов
/ 08 января 2010

Вы можете использовать сообщения Windows. Подробности смотрите в этом блоге .

...