Сбой фреймворка при печати документа XPS - PullRequest
1 голос
/ 11 августа 2011

У меня есть приложение .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.

...