Я создаю службу на VS2010, используя .net Framework 4.0 Client Profile. Конечным компьютером является 64-разрядная версия Windows Server 2003. Эта служба перемещает некоторые файлы, а затем выполняет процесс с помощью System.Diagnostics.Process. Беда в том, что, даже если диспетчер задач показывает процесс как начинающийся, исполняемый файл никогда не делает то, что было сделано. Пример кода:System.Diagnostics.Process не может начать процесс
private void imprimir(string nombreImpresora, int copias, string nombreArchivo)
{
try
{
string copiasSumatra = "1,";
for (int i = 1; i < copias; i++)
{
copiasSumatra += "1,";
}
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string comando = String.Format("-print-to \"{0}\" \"{1}\" -print-settings \"{2}odd,fit\" -silent", nombreImpresora, nombreArchivo, copiasSumatra);
string filename = '"' + Path.Combine(path, "SumatraPDF.exe") + '"';
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.WorkingDirectory = path;
proc.StartInfo.FileName = filename;
proc.StartInfo.Arguments = comando;
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.ErrorDialog = false;
proc.Start();
proc.WaitForExit();
lc.writeToLog("Instruction executed. Exit code: " + proc.ExitCode);
}
catch (Exception ex)
{
lc.writeToLog(ex.Message + " " + ex.StackTrace);
}
}
Если я исполню ее на моем Dev машины (окна 8 Pro) или в другом тестовом сервере (Windows Server 2003 32 бит), что делает, Что ожидается. Если я запустил его на 64-битном сервере WS2003, он ничего не делает.
Я отлаживал много раз, чтобы узнать, не вызывает ли ошибки, которую я пропускаю, но ничего не происходит. Метод lc.writeToLog печатает текст в файл. Я использовал его для регистрации каждой отдельной строки выполнения, но ошибка не возникает. Используя этот метод, я пришел к выводу, что он передает инструкцию proc.WaitForExit(), поэтому я думаю, что это будет делать то, что я запрограммировал, но ничего не происходит.
Я выполнил ту же инструкцию, но передал ей пользователя, пароль и домен, и результат был таким же. Также попытался захватить стандартную ошибку и вывод, но в ней ничего не было.
В чем может быть проблема?
Выполнение другого процесса в целом дает вам очень плохую диагностику, когда что-то идет не так. Особенно, когда вы не проверяете Process.ExitCode, единственный способ, которым вы * могли видеть, что что-то не так. Не задание StartInfo.WorkingDirectory также является большой ошибкой, файл действительно может быть создан, но вы просто не можете найти его, потому что вы не знаете, в какой каталог искать. Избегайте файлов .bat, все, что они могут сделать, вы можете сделать в C#. –
Я обновил свой код, чтобы использовать ваши предложения, как вы можете видеть. Теперь он показывает фактический код, который я пытаюсь выполнить (распечатайте pdf с помощью sumatra pdf). Код выхода процесса был равен 2. – t3b4n
Это, как правило, означает «Файл не найден», очень распространенная ошибка, конечно. Короче говоря, из несуществующего принтера или файла, который просто не существует, * nombreArchivo * должен быть полным путем к файлу. –