Я пытаюсь использовать именованный канал с использованием .net NamedPipeServerStream асинхронно, используя обратные вызовы в powershell.Асинхронные именованные каналы в powershell с использованием обратных вызовов
В настоящее время я использую следующий код:
сторона сервера:
$myCallback = [AsyncCallback]{
"Connected"
}
$pipe = New-Object System.IO.Pipes.NamedPipeServerStream("alert", [System.IO.Pipes.PipeDirection]::InOut, 1, [System.IO.Pipes.PipeTransmissionMode]::Message, [System.IO.Pipes.PipeOptions]::Asynchronous)
$pipe.BeginWaitForConnection($myCallback, "alertCallback")
сторона клиента:
$pipe = new-object System.IO.Pipes.NamedPipeClientStream("alert");
$pipe.Connect(3000);
$sw = new-object System.IO.StreamWriter($pipe);
$sw.WriteLine("Test");
я вызываю код на стороне сервера первым, который сообщает, что обратный вызов была успешно зарегистрирована
AsyncState IsCompleted AsyncWaitHandle CompletedSynchronously
---------- ----------- --------------- ----------------------
alertCallback False System.Threading.ManualRese... False
Как только клиентский код называется сценарием сервера powershell, исключение не выбрасывается, просто я получаю сообщение об ошибке «Windows Powershell перестало работать». Я не понимаю, почему это происходит, и я не могу получить какое-либо исключение или другую отладочную информацию из сценария, чтобы понять, что происходит не так. Если я попытаюсь сделать то же самое синхронно, все будет работать так, как ожидалось. Буду признателен за любую оказанную помощь.
Что-нибудь в Windows Logs на клиенте? – ojf
К сожалению, нет. Я смотрел в разделе Powershell журнала событий, я вижу записи об исключениях, о которых я знаю, и о них сообщалось в консоли из предыдущих неудачных попыток написания вышеуказанного кода, поэтому я предполагаю, что это подходящее место. – Nitr0UK
Вы можете использовать procdump из sysinternals, чтобы создать файл дампа при возникновении исключения. Что-то вроде 'procdump -ma -e 100'. После того, как у вас есть сбой, вы можете начать расследование с помощью WinDbg. –