2013-10-02 3 views
0

Я создаю службу на 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(), поэтому я думаю, что это будет делать то, что я запрограммировал, но ничего не происходит.

Я выполнил ту же инструкцию, но передал ей пользователя, пароль и домен, и результат был таким же. Также попытался захватить стандартную ошибку и вывод, но в ней ничего не было.

В чем может быть проблема?

+0

Выполнение другого процесса в целом дает вам очень плохую диагностику, когда что-то идет не так. Особенно, когда вы не проверяете Process.ExitCode, единственный способ, которым вы * могли видеть, что что-то не так. Не задание StartInfo.WorkingDirectory также является большой ошибкой, файл действительно может быть создан, но вы просто не можете найти его, потому что вы не знаете, в какой каталог искать. Избегайте файлов .bat, все, что они могут сделать, вы можете сделать в C#. –

+0

Я обновил свой код, чтобы использовать ваши предложения, как вы можете видеть. Теперь он показывает фактический код, который я пытаюсь выполнить (распечатайте pdf с помощью sumatra pdf). Код выхода процесса был равен 2. – t3b4n

+0

Это, как правило, означает «Файл не найден», очень распространенная ошибка, конечно. Короче говоря, из несуществующего принтера или файла, который просто не существует, * nombreArchivo * должен быть полным путем к файлу. –

ответ

0

Это была проблема, связанная с сервером. После развертывания приложения на производственном сервере проблема исчезла.

Смежные вопросы