Обмен данными между C # и Visual C ++ через порт IPC (ИЛИ: обмен типами между DLL-библиотекой Visual C ++ и приложением C #) - PullRequest
0 голосов
/ 08 октября 2010

У меня есть DLL, написанная на Visual C ++, и приложение, написанное на C #. Приложение, написанное на C #, уже использует IPC между несколькими экземплярами самого себя, поэтому оно запускает только один экземпляр (оно пытается запустить сервер IPC и, если не может предположить, что оно уже запущено, в этом случае оно отправляет аргументы командной строки через IPC для существующего приложения).

Теперь я хочу отправить команды из Visual C ++, однако, даже когда я создаю определение типа в Visual C ++, совпадающее с определением в C # (на уровне реализации), оно отклоняет соединение, потому что они по сути все еще два разных типы (из двух разных сборок).

Я думал об использовании Reflection в Visual C ++ для извлечения типа из сборки C #, но я не могу этого сделать, потому что тогда мне придется отправлять сборку вдоль библиотеки DLL (что противоречит цели использования библиотеки DLL). API для приложения).

Я не уверен, что смогу сделать это иначе, кроме как сохранить класс в еще одной DLL и сделать так, чтобы и приложение, и DLL API ссылались на этот класс, но это также не идеальное решение как я хотел бы распространять одну API-библиотеку API.

Есть ли какие-либо предложения относительно того, как я могу подключиться через IPC (другие виды связи, такие как TCP, не разрешены) для отправки запросов в приложение?

1 Ответ

1 голос
/ 08 октября 2010

Решение состояло в том, чтобы поместить класс InterProcess в API-библиотеку API и просто заставить приложение C # использовать библиотеку DLL в качестве ссылки для ввода в класс.

Также важно отметить, что для инициализацииДля общего объекта я должен был инициализировать серверную часть общего доступа в отдельном домене приложений и сделать приложение C # таким клиентом (это новая версия предыдущей вставки):

try
{
    // Set up an interprocess object which will handle instructions
    // from the client and pass them onto the main Manager object.
    this.m_ServerDomain = AppDomain.CreateDomain("roketpack_server");
    this.m_ServerDomain.DoCallBack(() =>
        {
            // We must give clients the permission to serialize delegates.
            BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider();
            serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

            IpcServerChannel ipc = new IpcServerChannel("roketpack", "roketpack", serverProv);
            ChannelServices.RegisterChannel(ipc, true);

            RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(API.InterProcess),
                "InterProcessManager",
                WellKnownObjectMode.Singleton);
        });

    // Now initialize the object.
    IpcClientChannel client = new IpcClientChannel();
    ChannelServices.RegisterChannel(client, true);
    this.m_InterProcess = (API.InterProcess)Activator.GetObject(
        typeof(API.InterProcess),
        "ipc://" + name + "/InterProcessManager");
    InterProcessHandle.Manager = this;
    this.m_InterProcess.SetCalls(InterProcessHandle.CallURL,
                    InterProcessHandle.IsLatestVersion,
                    InterProcessHandle.RequestUpdate);

    return true;
}
catch (RemotingException)
{
    // The server appears to be already running.  Connect to
    // the channel as a client and send instructions back
    // to the server.
    IpcClientChannel client = new IpcClientChannel();
    ChannelServices.RegisterChannel(client, true);

    API.InterProcess i = (API.InterProcess)Activator.GetObject(
        typeof(API.InterProcess),
        "ipc://" + name + "/InterProcessManager");

    if (i == null)
    {
        Errors.Raise(Errors.ErrorType.ERROR_CAN_NOT_START_OR_CONNECT_TO_IPC);
        return false;
    }

    if (Environment.GetCommandLineArgs().Length > 1)
        i.CallURL(Environment.GetCommandLineArgs()[1]);

    return false;
}

Iнадеюсь, что это решение поможет кому-то еще:)

...