У меня есть приложение .NET 4.0, которое отправляет объекты FixedDocument на принтер с помощью XpsDocumentWriter. Я столкнулся с падением приложения в нескольких сценариях. Насколько я могу судить, это проблема совместимости с XPS и некоторыми драйверами печати. Я включаю трассировку стека ниже. Я хотел бы либо заставить его работать должным образом, либо определить проблему до сбоя, чтобы предотвратить попытки пользователей распечатать на принтере, что приведет к сбою приложения. Я не могу перехватить исключение в блоке try catch, поскольку исключение выдается в другом потоке во внешнем коде.
Мой код выглядит примерно так:
Dim printQueue as PrintQueue
'initialize printQueue
Dim printDocument as FixedDocument
'initialize printDocument
'add content to printDocument
Dim writer As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue)
AddHandler writer.WritingCompleted, AddressOf WriteDocumentComplete
writer.WriteAsync(printDocument, printQueue.UserPrintTicket)
Я попытался заглянуть в реестр, чтобы определить, основан ли драйвер печати на универсальном драйвере печати Microsoft, но это не похоже на надежный метод. У меня есть некоторые принтеры, которые не имеют явной зависимости и работают нормально.
HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Control \ Print \ Environments \ Windows NT x86 \ Драйверы \ Версия-3 \ Microsoft XPS Document Writer
Трассировка стека из журнала событий приложения:
Приложение: MyApp.exe
Версия Framework: v4.0.30319
Описание: процесс был прерван из-за необработанного исключения.
Информация об исключении: System.InvalidOperationException
стек:
в Microsoft.Internal.AlphaFlattener.MetroDevice0.AssertState (DeviceState, DeviceState)
в Microsoft.Internal.AlphaFlattener.MetroToGdiConverter.EndDocument ()
в System.Windows.Xps.Serialization.NgcSerializationManagerAsync.EndDocument (Boolean)
в System.Windows.Xps.Serialization.NgcSerializationManagerAsync.InvokeSaveAsXamlWorkItem (System.Object)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall (System.Delegate, System.Object, Int32)
в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (System.Object, System.Delegate, System.Object, Int32, System.Delegate)
в System.Windows.Threading.DispatcherOperation.InvokeImpl ()
в System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext (System.Object)
в System.Threading.ExecutionContext.runTryCode (System.Object)
в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (TryCode, CleanupCode, System.Object)
в System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
в System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
в System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
в System.Windows.Threading.DispatcherOperation.Invoke ()
в System.Windows.Threading.Dispatcher.ProcessQueue ()
в System.Windows.Threading.Dispatcher.WndProcHook (IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
в MS.Win32.HwndWrapper.WndProc (IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
в MS.Win32.HwndSubclass.DispatcherCallbackOperation (System.Object)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall (System.Delegate, System.Object, Int32)
в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (System.Object, System.Delegate, System.Object, Int32, System.Delegate)
в System.Windows.Threading.Dispatcher.InvokeImpl (System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
в MS.Win32.HwndSubclass.SubclassWndProc (IntPtr, Int32, IntPtr, IntPtr)
в MS.Win32.UnsafeNativeMethods.DispatchMessage (System.Windows.Interop.MSG ByRef)
в System.Windows.Threading.Dispatcher.PushFrameImpl (System.Windows.Threading.DispatcherFrame)
в System.Windows.Threading.Dispatcher.PushFrame (System.Windows.Threading.DispatcherFrame)
в System.Windows.Threading.Dispatcher.Run ()
в System.Windows.Application.RunDispatcher (System.Object)в System.Windows.Application.RunInternal (System.Windows.Window)
в System.Windows.Application.Run (System.Windows.Window)
в System.Windows.Application.Run ()
в MyApp.Application.Main ()
Для получения дополнительной информации см. Центр справки и поддержки по адресу http://go.microsoft.com/fwlink/events.asp.
Обновление:
Я говорил с Microsoft. Мне сказали, что обходного пути нет, и это будет исправлено в .NET 4.5.