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(); + } } }