Handling Application Events: On Application Exit


   

using System;
using System.Threading;
using System.Reflection;
using System.Windows.Forms;
   

public class HelloWorldForm : Form
{
    public HelloWorldForm()
    {
        Text = "Hello, WindowsForms!";
    }
}
   
public class ApplicationEventHandlerClass
{
    public void OnApplicationExit(object sender, EventArgs e)
    {
        try
        {
            Console.WriteLine("The application is shutting down.");
        }
        catch(NotSupportedException)
        {
        }
    }
}
   
public class MainClass
{
    public static void Main()
    {
        HelloWorldForm FormObject = new HelloWorldForm();
        ApplicationEventHandlerClass AppEvents = new ApplicationEventHandlerClass();
   
        Application.ApplicationExit += new EventHandler(AppEvents.OnApplicationExit);
        Application.Run(FormObject);
    }
}

           
          


Handling Application Events: OnIdle, OnThreadException, OnThreadExit

   
 


using System;
using System.Threading;
using System.Reflection;
using System.Windows.Forms;

public class HelloWorldForm : Form {
    public HelloWorldForm() {
    }

    public static void OnApplicationExit(object sender, EventArgs e) {
        try {
            Console.WriteLine("shutting down.");
        } catch (NotSupportedException) {
        }
    }

    public static void OnIdle(object sender, EventArgs e) {
        Console.WriteLine("idle.");
    }

    public static void OnThreadException(object sender, ThreadExceptionEventArgs e) {
        Console.WriteLine("caught!");
    }

    public static void OnThreadExit(object sender, EventArgs e) {
        Console.WriteLine("thread is shutting down.");
    }

    public static void Main() {
        HelloWorldForm FormObject = new HelloWorldForm();

        Application.ApplicationExit += new EventHandler(OnApplicationExit);
        Application.Idle += new EventHandler(OnIdle);
        Application.ThreadException += new ThreadExceptionEventHandler(OnThreadException);
        Application.ThreadExit += new EventHandler(OnThreadExit);
        Application.Run(FormObject);
    }
}

    


OnUnhandledException method is added to the AppDomain.UnhandledException event

   
 

using System;

public class Starter {
    public static void Main() {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
        int vara = 5, varb = 0;
        vara /= varb;
    }

    public static void OnUnhandledException(
            object sender, UnhandledExceptionEventArgs e) {
        string application_name = sender.ToString();
        Exception except = (Exception)e.ExceptionObject;
        string errormessage = "Application " + application_name +
            " [ Exception " + except.Message + " ]";
        Console.WriteLine(errormessage);
    }
}

    


creates three instances of the same type. A local and two remote proxies to object instances are constructed:

   
 

using System;
using System.Reflection;
using System.Runtime.Remoting;


class MyClass {
    public void MethodA(DateTime dt) {
        Console.WriteLine("MethodA invoked at " + dt.ToLongTimeString());
    }
}

class Starter {

    static void Main() {
        CreateLocal();
        CreateRemote1();
        CreateRemote2();
    }

    static void CreateLocal() {
        object obj = Activator.CreateInstance(typeof(MyClass));
        ((MyClass)obj).MethodA(DateTime.Now);
    }

    static void CreateRemote1() {
        ObjectHandle hObj = Activator.CreateInstance("library","MyClass");
        object obj = hObj.Unwrap();

        MethodInfo method = obj.GetType().GetMethod("MethodA");
        method.Invoke(obj, new object[1] { DateTime.Now });
    }

    static void CreateRemote2() {
        AppDomain domain = AppDomain.CurrentDomain;
        object obj = domain.CreateInstanceFromAndUnwrap("library.dll","MyClass");
        MethodInfo method = obj.GetType().GetMethod("MethodA");
        method.Invoke(obj, new object[1] { DateTime.Now });
    }
}

    


FriendlyName

   
 

using System;
using System.Collections.Generic;
using System.Text;

class Program {
    static void Main(string[] args) {
        AppDomain currentDomain = AppDomain.CurrentDomain;
        Console.WriteLine(currentDomain.FriendlyName);
        AppDomain secondDomain = AppDomain.CreateDomain("New AppDomain");
        secondDomain.CreateInstance("AssemblyA", "AppDomains.Demo", true,System.Reflection.BindingFlags.CreateInstance, null, new object[] { 7, 3 }, null, null, null);
    }
}

    


SetPrincipalPolicy

   
 
using System;
using System.Security;
using System.Security.Principal;
using System.Security.Permissions;

class Program {
    static void Main(string[] args) {
        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
        try {
            ShowMessage();
        } catch (SecurityException exception) {
            Console.WriteLine(exception.Message);
        }
    }

    [PrincipalPermissionAttribute(SecurityAction.Demand,Role = "BUILTINUsers")]
    static void ShowMessage() {
        Console.WriteLine("The current principal is logged in locally ");
        Console.WriteLine("(they are a member of the local Users group)");
    }
}