Я пишу приложение UWP с широким использованием API-интерфейсов Win2D.
Иногда, без определенного шаблона или возможности систематического воспроизведения поведения, возникает незамеченное исключение типа System.Exception {System. Runtime.InteropServices.COMException} вызывается платформой без трассировки стека и только следующего сообщения:
Error HRESULT E_FAIL has been returned from a call to a COM component.
и чуть более полезного описания
Objects used together must be created from the same factory instance.
Поскольку нет трассировка стека, я не могу понять, что является причиной такого исключения, ни кусок кода, который его производит.
Согласно описанию, я пытался использовать одну фабрику для каждой операции Win2D, и, в частности, я собрал в 3 переменных c stati c фабрики, которые я использую:
public static class Win2DUtils
{
public static readonly Compositor Compositor = Window.Current.Compositor;
public static readonly CanvasDevice CanvasDev = CanvasDevice.GetSharedDevice();
public static readonly CompositionGraphicsDevice GraphicsDevice = CanvasComposition.CreateCompositionGraphicsDevice(Compositor, CanvasDev);
}
Даже с этим escamotage, я все еще испытываю проблему.
Я также пытался в Visual Studio пометить все возможные исключения, чтобы остановить выполнение, когда они вызваны, но если с этим параметром исключение полностью не пойман и может быть воспринят только благодаря встроенной обработке исключений Visual Studio в режиме отладки (код в App.gics, который автоматически добавляется скаффолдингом Visual Studio в каждый проект UWP, что-то вроде:
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>
{
if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
};
#endif
Кто-нибудь знает о том, что может быть возможной причиной и, по крайней мере, как найти источник исключения?
Большое спасибо
cghersi