WPF COMException запускает приложение при запуске (начато сегодня)
Я только сегодня начал видеть это исключение в дикой природе при запуске приложения с приложением, которое было в производстве в течение 3 лет.
System.TypeInitializationException: The type initializer for 'MS.Win32.Penimc.UnsafeNativeMethods' threw an exception. ---> System.Runtime.InteropServices.COMException: Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
at MS.Win32.Penimc.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)
at MS.Win32.Penimc.UnsafeNativeMethods.CreatePimcManager()
at MS.Win32.Penimc.UnsafeNativeMethods..cctor()
--- End of inner exception stack trace ---
at MS.Win32.Penimc.UnsafeNativeMethods.CreateResetEvent(IntPtr& handle)
at System.Windows.Input.PenThreadWorker..ctor()
at System.Windows.Input.PenThreadPool.GetPenThreadForPenContextHelper(PenContext penContext)
at System.Windows.Input.PenThreadPool.GetPenThreadForPenContext(PenContext penContext)
at System.Windows.Input.StylusWisp.WispTabletDeviceCollection.UpdateTabletsImpl()
at System.Windows.Input.StylusWisp.WispTabletDeviceCollection.UpdateTablets()
at System.Windows.Input.StylusWisp.WispTabletDeviceCollection..ctor()
at System.Windows.Input.StylusWisp.WispLogic.get_WispTabletDevices()
at System.Windows.Input.StylusWisp.WispLogic.RegisterHwndForInput(InputManager inputManager, PresentationSource inputSource)
at System.Windows.Interop.HwndStylusInputProvider..ctor(HwndSource source)
at System.Windows.Interop.HwndSource.Initialize(HwndSourceParameters parameters)
at System.Windows.Window.CreateSourceWindow(Boolean duringShow)
at System.Windows.Window.CreateSourceWindowDuringShow()
at System.Windows.Window.SafeCreateWindowDuringShow()
at System.Windows.Window.ShowHelper(Object booleanBox)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.ProcessQueue()
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at APSSSentinel.App.Main()
Ответы
Ответ 1
Обновление: теперь Microsoft исправила эту проблему в ручном обновлении (как отметил Юрген), лично Я буду придерживаться обходного пути до тех пор, пока исправление не будет в автоматическом обновлении, потому что будет очень много работы, чтобы каждый пользователь установил обновление вручную.
Это, очевидно, ошибка в .Net 4.7, которая влияет на системы Windows 7 и 8/8.1, у которых есть сенсорное устройство ввода. Поэтому можно надеяться, что Microsoft обратится к этому в будущем обновлении. Тем временем единственным способом сохранить полную функциональность является удаление и скрытие обновления.
Другим вариантом является отключение стилей и поддержка касания либо в app.config(как в вашей ссылке), либо в коде, если приложение скомпилировано с 4.6 или новее. Вы не указали, почему это не идеально, но я предполагаю, что эти функции необходимы? Обратите внимание, что отключение не означает, что каждое приложение непригодно для использования с сенсорными устройствами, а скорее, что они используют только функции, доступные с помощью мыши. Обновление: очевидно, пользователи устройств без мыши будут иметь проблемы с использованием пользовательского интерфейса, который требует прокрутки.
Здесь примеры кода для тех, кто приходит сюда, ищут быстрое исправление:
В App.config(работает с приложениями, скомпилированными с любой версией фреймворка)
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport=true" />
</runtime>
</configuration>
В коде (при компиляции с .Net Framework >= 4.6)
protected override void OnStartup(StartupEventArgs e)
{
AppContext.SetSwitch("Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport", true);
base.OnStartup(e);
}
Ответ 2
Microsoft устранила проблему с .NET 4.7 тем временем, см.
https://support.microsoft.com/en-US/help/4033488/comexception-error-from-wpf-applications-after-the-net-framework-4-7-i