Создание простого анонимного канала между приложением Windows и DLL - PullRequest
0 голосов
/ 24 августа 2018

У меня есть настольное приложение и DLL. Я хочу вызывать функции DLL, и в процессе этих функций я хочу, чтобы DLL отправляла текстовые сообщения обратно в приложение, чтобы изменить элементы управления формы (добавляя метки для информирования пользователя о ходе выполнения функции DLL). Я решил использовать AnnonymousPipe с приложением, действующим в качестве сервера, а DLL в качестве клиента. Канал только односторонний (клиент отправляет сообщения на сервер). У меня есть следующий код:

Класс ServerEndPipe:

private AnonymousPipeServerStream inComingServerPipe;
    private CallBack callback;

    public delegate void CallBack(string msg);

    public ServerEndPipe(CallBack callback)
    {
        this.callback = callback;

        inComingServerPipe = new AnonymousPipeServerStream(PipeDirection.In, HandleInheritability.Inheritable);
        inComingServerPipe.DisposeLocalCopyOfClientHandle();

        new Thread(delegate()
        {
            using (StreamReader isr = new StreamReader(inComingServerPipe))
            {
                string tmp;
                while (true)
                {
                    tmp = isr.ReadLine();
                    if (tmp != null) { callback(tmp); }
                }
            }
        }).Start();
    }

    public string GetPipeStreamHandle()
    {
        return inComingServerPipe.GetClientHandleAsString();
    }

Реализация ClientEndPipe:

private PipeStream clientOut;
    private StreamWriter csw;

    public ClientEndPipe(ServerEndPipe server_pipe)
    {
        clientOut = new AnonymousPipeClientStream(PipeDirection.Out, server_pipe.GetPipeStreamHandle());

        csw = new StreamWriter(clientOut);
        csw.AutoFlush = true;
    }

    public bool SendText(String msg)
    {
        try
        {
            csw.WriteLine(msg);
            clientOut.WaitForPipeDrain();
        }
        catch (Exception) { }
        return true;
    }

Код приложения, где я инициализирую трубы:

serverEndPipe = new ServerEndPipe(delegate (string message)
            {
                this.Invoke((MethodInvoker)delegate ()
                {
                    this.label_msg.Text = message;
                });
            });

            command_processor.Initialize(HiL_Testbench.Languages.LANGUAGE.CZECH, config_file_path, variables_file_path, serverEndPipe);

И раздел command_processor (CommandProcessor - публичный класс в DLL с функциями, которые я хочу вызвать позже) функции Initialise, где я инициализирую клиентский конец канала:

clientEndPipe = new ClientEndPipe(server_pipe);

Однако я получаю IOException в конструкторе ClientEndPipe в строке:

clientOut = new AnonymousPipeClientStream(PipeDirection.Out, server_pipe.GetPipeStreamHandle());

высказывание: недопустимая операция канала или что-то в этом роде (по какой-то причине Visual Studio переводит сообщения об исключении на чешский, а все остальное - на английский).

Есть идеи, как заставить это работать?

Спасибо !!!

...