Console.WriteLine ("in " + Thread.GetDomain ().FriendlyName);
return x + 1;
}
+
+ public void start_wait () {
+ Action a = delegate () {
+ Thread.Sleep (10000);
+ };
+ a.BeginInvoke (null, null);
+ }
}
[Serializable]
}
}
+public interface IRunnable {
+ void Run ();
+}
+
+public class MBRObject : MarshalByRefObject, IRunnable {
+ /* XDomain wrappers for invocation */
+ public void Run () {
+ while (true) {
+ try {
+ while (true)
+ Thread.Sleep (100);
+ }
+ catch (ThreadAbortException ex) {
+ Thread.ResetAbort ();
+ }
+ }
+ }
+}
+
+public class CBObject : ContextBoundObject, IRunnable {
+ /* Slow corlib path for invocation */
+ public void Run () {
+ while (true) {
+ try {
+ while (true)
+ Thread.Sleep (100);
+ }
+ catch (ThreadAbortException ex) {
+ Thread.ResetAbort ();
+ }
+ }
+ }
+}
+
public class UnloadThread {
AppDomain domain;
}
*/
+ public static void ThreadStart (object obj)
+ {
+ IRunnable runnable = (IRunnable)obj;
+
+ try {
+ runnable.Run ();
+ } catch (AppDomainUnloadedException) {
+ Console.WriteLine ("OK");
+ } catch (ThreadAbortException) {
+ throw new Exception ();
+ }
+ }
+
+ public static int test_0_unload_reset_abort () {
+ AppDomain domain = AppDomain.CreateDomain ("test_0_unload_reset_abort");
+ MBRObject mbro = (MBRObject) domain.CreateInstanceFromAndUnwrap (typeof (Tests).Assembly.Location, "MBRObject");
+ CBObject cbo = (CBObject) domain.CreateInstanceFromAndUnwrap (typeof (Tests).Assembly.Location, "CBObject");
+
+ new Thread (ThreadStart).Start (mbro);
+ new Thread (ThreadStart).Start (cbo);
+ Thread.Sleep (100);
+
+ AppDomain.Unload (domain);
+ return 0;
+ }
+
static void Worker (object x) {
Thread.Sleep (100000);
}
public static int test_0_unload_inside_appdomain_sync () {
AppDomain domain = AppDomain.CreateDomain ("Test3");
+ bool caught = false;
try {
domain.DoCallBack (new CrossAppDomainDelegate (SyncCallback));
}
- catch (Exception ex) {
- /* Should throw a ThreadAbortException */
- Thread.ResetAbort ();
+ catch (AppDomainUnloadedException ex) {
+ caught = true;
}
+ if (!caught)
+ return 1;
+
return 0;
}
}
}
+ public static int test_0_abort_wait () {
+ AppDomain domain = AppDomain.CreateDomain ("AbortWait");
+ Bar bar = (Bar)domain.CreateInstanceAndUnwrap (typeof (Tests).Assembly.FullName, "Bar");
+ int x;
+
+ bar.start_wait ();
+ AppDomain.Unload (domain);
+ return 0;
+ }
+
// FIXME: This does not work yet, because the thread is finalized too
// early
/*