Пытаюсь передать данные из одной программы в другую через перенаправление ввода, примерно так:
Запускающая программа
var serializer = new XmlSerializer(typeof(PowershellCommand));
// Говнокод, в процессе переделкиvar pwd = new NetworkCredential("", command.Password).SecurePassword;
var psi = new ProcessStartInfo
{
Domain = command.Domain,
UserName = command.UserName,
Password = pwd,
FileName = powershellHostPath,
CreateNoWindow = true,
RedirectStandardInput = true,
};
try
{
var process = Process.Start(psi);
serializer.Serialize(process.StandardInput, command.Command);
process.StandardInput.Close();
return process;
}
catch (Win32Exception ex) when (ex.HResult == -2147467259 && ex.NativeErrorCode == 1326) // 0x80004005
Вызываемая программа
private PowershellCommand GetCommand()
{
if (Console.IsInputRedirected)
{
return ReadCommand(Console.In);
} else {...}
}
private PowershellCommand ReadCommand(System.IO.TextReader textReader)
{
var serializer = new XmlSerializer(typeof(PowershellCommand));
return (PowershellCommand)serializer.Deserialize(textReader);
}
Всё работает отлично, пока не встречается текст на русском — он превращается в кашу. Есть какой-нибудь способ корректно передавать кодировку (я пока обошёл это Base64)?
ЗЫ. Побочный вопрос: насколько я понимаю, если stdout родительского процесса перенаправлен, у дочернего он тоже будет перенаправлен — можно ли как-то заставить его игнорировать перенаправление и выводить в консоль?
Здравствуйте, Somescout, Вы писали:
S>Всё работает отлично, пока не встречается текст на русском — он превращается в кашу. Есть какой-нибудь способ корректно передавать кодировку (я пока обошёл это Base64)?
А с какой кодировкой сериализует сейчас XmlSerializer? По дефолту там вроде UTF-16 должно быть, странно что получается каша. Возможно, у этих софтин окна не юникодные?
Здравствуйте, Mr.Delphist, Вы писали:
S>>Всё работает отлично, пока не встречается текст на русском — он превращается в кашу. Есть какой-нибудь способ корректно передавать кодировку (я пока обошёл это Base64)?
MD>А с какой кодировкой сериализует сейчас XmlSerializer? По дефолту там вроде UTF-16 должно быть, странно что получается каша. Возможно, у этих софтин окна не юникодные?
У меня есть предположение, что родительская софтина (1С, которая запускает "запускатель") для себя выставляет другую кодировку, т.к. при запуске из обычного cmd ошибка не проявляется (если оставить кодировку по умолчанию).
Здравствуйте, Somescout, Вы писали:
S>У меня есть предположение, что родительская софтина (1С, которая запускает "запускатель") для себя выставляет другую кодировку, т.к. при запуске из обычного cmd ошибка не проявляется (если оставить кодировку по умолчанию).
Тогда надо исследовать с какими параметрами оно порождает консоль, да. Вдруг там KOI-8R
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Mr.Delphist, Вы писали:
MD>>А с какой кодировкой сериализует сейчас XmlSerializer? По дефолту там вроде UTF-16 должно быть
НС>UTF-8
Почему? Вроде стандартная кодировка в .NET именно двухбайтовая, чтобы не порождать лишних перекодировок при работе со стрингами.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Mr.Delphist, Вы писали:
НС>>>UTF-8 MD>>Почему? Вроде стандартная кодировка в .NET именно двухбайтовая
НС>Стандартная для ввода/вывода — UTF8.
Encoding
The text encoding to use. The default is Encoding.UTF8.
Возможно, в первую очередь для компактного размера результатирующего буфера — вроде однобайтовый, но для нестандартных символов тоже работает (за счёт переключающих префиксов).