From c35755857c14df597d26dafd309fd26f3cfc3273 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Sun, 19 Jan 2020 19:35:52 -0300 Subject: [PATCH] basic implementation of exception dispatch on avalonia.native. --- src/Avalonia.Native/Avalonia.Native.csproj | 5 +++-- src/Avalonia.Native/CallbackBase.cs | 10 +++++++++- src/Avalonia.Native/PlatformThreadingInterface.cs | 10 ++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Native/Avalonia.Native.csproj b/src/Avalonia.Native/Avalonia.Native.csproj index 65c2a75b1c..1a2bdeef1e 100644 --- a/src/Avalonia.Native/Avalonia.Native.csproj +++ b/src/Avalonia.Native/Avalonia.Native.csproj @@ -19,8 +19,9 @@ - - + + + diff --git a/src/Avalonia.Native/CallbackBase.cs b/src/Avalonia.Native/CallbackBase.cs index 67c383f6ae..84eff35b30 100644 --- a/src/Avalonia.Native/CallbackBase.cs +++ b/src/Avalonia.Native/CallbackBase.cs @@ -2,11 +2,12 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.Runtime.ExceptionServices; using SharpGen.Runtime; namespace Avalonia.Native { - public class CallbackBase : SharpGen.Runtime.IUnknown + public class CallbackBase : SharpGen.Runtime.IUnknown, IExceptionCallback { private uint _refCount; private bool _disposed; @@ -76,5 +77,12 @@ namespace Avalonia.Native { } + + public void RaiseException(Exception e) + { + var exceptionInfo = ExceptionDispatchInfo.Capture(e); + + PlatformThreadingInterface.s_exceptionDispatchInfo = exceptionInfo; + } } } diff --git a/src/Avalonia.Native/PlatformThreadingInterface.cs b/src/Avalonia.Native/PlatformThreadingInterface.cs index 353124a9d1..000c7a62cf 100644 --- a/src/Avalonia.Native/PlatformThreadingInterface.cs +++ b/src/Avalonia.Native/PlatformThreadingInterface.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.Runtime.ExceptionServices; using System.Threading; using Avalonia.Native.Interop; using Avalonia.Platform; @@ -12,6 +13,8 @@ namespace Avalonia.Native { public class PlatformThreadingInterface : IPlatformThreadingInterface { + public static ExceptionDispatchInfo s_exceptionDispatchInfo; + class TimerCallback : CallbackBase, IAvnActionCallback { readonly Action _tick; @@ -82,6 +85,13 @@ namespace Avalonia.Native cancellation = null; } } + + if(s_exceptionDispatchInfo != null) + { + // TODO terminate NSApp. + + s_exceptionDispatchInfo.Throw(); + } } }