@@ -2277,7 +2277,7 @@ ves_icall_System_AppDomain_InternalUnload (gint32 domain_id, MonoError *error)
2277
2277
return ;
2278
2278
2279
2279
MonoException * exc = NULL ;
2280
- mono_domain_try_unload (domain , (MonoObject * * )& exc );
2280
+ mono_domain_try_unload (domain , (MonoObject * * )& exc , NULL );
2281
2281
if (exc )
2282
2282
mono_error_set_exception_instance (error , exc );
2283
2283
}
@@ -2643,7 +2643,7 @@ void
2643
2643
mono_domain_unload (MonoDomain * domain )
2644
2644
{
2645
2645
MonoObject * exc = NULL ;
2646
- mono_domain_try_unload (domain , & exc );
2646
+ mono_domain_try_unload (domain , & exc , NULL );
2647
2647
}
2648
2648
2649
2649
static MonoThreadInfoWaitRet
@@ -2659,9 +2659,12 @@ guarded_wait (MonoThreadHandle *thread_handle, guint32 timeout, gboolean alertab
2659
2659
}
2660
2660
2661
2661
/**
2662
- * mono_domain_unload :
2662
+ * mono_domain_try_unload :
2663
2663
* \param domain The domain to unload
2664
2664
* \param exc Exception information
2665
+ * \param callback Passes exception information back to caller before domain is unloaded
2666
+ *
2667
+ * NOTE: If the callback param is not null the domain unload will continue after executing the callback.
2665
2668
*
2666
2669
* Unloads an appdomain. Follows the process outlined in:
2667
2670
* http://blogs.gotdotnet.com/cbrumme
@@ -2678,7 +2681,7 @@ guarded_wait (MonoThreadHandle *thread_handle, guint32 timeout, gboolean alertab
2678
2681
* process could end up trying to abort the current thread.
2679
2682
*/
2680
2683
void
2681
- mono_domain_try_unload (MonoDomain * domain , MonoObject * * exc )
2684
+ mono_domain_try_unload (MonoDomain * domain , MonoObject * * exc , MonoUnityExceptionFunc callback )
2682
2685
{
2683
2686
MonoError error ;
2684
2687
MonoThreadHandle * thread_handle ;
@@ -2724,10 +2727,14 @@ mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
2724
2727
}
2725
2728
2726
2729
if (* exc ) {
2727
- /* Roll back the state change */
2728
- domain -> state = MONO_APPDOMAIN_CREATED ;
2729
- mono_domain_set (caller_domain , FALSE);
2730
- return ;
2730
+ if (callback != NULL )
2731
+ callback (* exc );
2732
+ else {
2733
+ /* Roll back the state change */
2734
+ domain -> state = MONO_APPDOMAIN_CREATED ;
2735
+ mono_domain_set (caller_domain , FALSE);
2736
+ return ;
2737
+ }
2731
2738
}
2732
2739
mono_domain_set (caller_domain , FALSE);
2733
2740
0 commit comments