Похоже, что при попытке использовать пространство имен System.Drawing.Printing.PrintDocument в 64-разрядном (SP1) Windows 7 оно отлично работает. Но попробовав тот же код на 64-битном (SP1) сервере 2008 R2, он просто зависает в коде. Никакие исключения не выбрасываются и т.д....
Вот фрагмент моего кода...
private bool PrintTIF(string sPrinter, string sFile)
{
try
{
//Open file for printing
WriteEvent(105, "Opening the file for printing using streamreader...", CustomLogTool.EventLogEntryTypeExtentions.Debug);
m_PrinterFile = new StreamReader(sFile);
//Set the document name
WriteEvent(105, "Set the document name.", CustomLogTool.EventLogEntryTypeExtentions.Debug);
m_Printer.DocumentName = Path.GetFileName(sFile);
//Print file
WriteEvent(105, "Sending the file to the printer...", CustomLogTool.EventLogEntryTypeExtentions.Debug);
m_Printer.Print();
m_PrinterFilesPrinting.Add(new PrintInfo(sFile, null, sPrinter));
//Close file
WriteEvent(105, "Closing the file and destorying the streamreader object.", CustomLogTool.EventLogEntryTypeExtentions.Debug);
m_PrinterFile.Close();
//Success
return true;
}
catch (Exception ex)
{
try { m_PrinterFile.Close(); }
catch { }
WriteEvent(201, ex.Message, CustomLogTool.EventLogEntryTypeExtentions.Debug);
return false;
}
}
Я регистрирую события журнала до "Отправка файла на принтер...". Я ничего не получаю, я ожидаю получить сообщение об ошибке 201 в исключении. Но я ничего не получаю. Это как если бы программа зависла. Я предполагаю, что это произошло из-за того, что было изменено с Win7 (SP1) на Server2008R2 (SP1). Есть идеи?
Решение: Я понял, в чем моя проблема. Это связано с тем, что я все время выбрал неправильный принтер! Много времени потрачено на такую простую вещь, но это привело меня к тому, чтобы подходить к отладке по-другому. После того, как я начал использовать правильный принтер, я узнал, что мой следующий выпуск - это файл TIFF, который не является фактическим файлом TIFF. Это тестовый файл с 0 байтами, который я забыл в тестовом каталоге.
Мой новый подход к отладке этих проблем с обслуживанием принтера: лучший способ узнать, что происходит, - это немного выйти из "Сервисного царства". Скомпилируйте его как сборку Debug и таким образом вы можете запустить его в качестве консольного приложения. Создав его как сборку Release, вы должны запустить его как службу и НЕ разрешите запускать его вручную. Когда я построил его как выпуск Debug, я запустил его на сервере из каталога, а затем появилось диалоговое окно Windows... Он спрашивал меня, что я хотел сохранить как файл. Вскоре после того, как я понял, что это был принтер Microsoft XPS Document Writer по умолчанию!
Затем я вошел и сменил принтер на тот, который мне нужен (через код)...
PrintDocument pd = new PrintDocument();
pc = new StandardPrintController();
pd.PrintController = pc;
// Yadda Yadda Yadda...
pd.PrinterSettings.PrinterName = "My Printer Name";
Надеюсь, что это поможет кому-то еще и сэкономит их некоторое время! Удачи!