У меня есть настольное приложение и 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 переводит сообщения об исключении на чешский, а все остальное - на английский).
Есть идеи, как заставить это работать?
Спасибо !!!