//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
// 
using System;
using System.Threading;
using System.Reflection;
using System.Runtime.Remoting;
using InterAppDomain;

namespace AppDomainTest
{
	/// <summary>
	/// Podsumowanie dla Class1.
	/// </summary>
	class InterAppDomain
	{
		static void Main(string[] args)
		{
			// Ustawienie ApplicationBase na aktualny katalog

			AppDomainSetup info = new AppDomainSetup();

			info.ApplicationBase = "file:\\\\" + System.Environment.CurrentDirectory;

			// Utworzenie domeny aplikacji z pustym dowodem

			AppDomain dom = AppDomain.CreateDomain("RemoteDomain", null, info);

			// Załadowanie podzespołu HelloWorld2 i utworzenie egzemplarza
			// typu HelloWorld
			BindingFlags flags = (BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance);
			ObjectHandle objh = dom.CreateInstance("Fault", "InterAppDomain.Fault", false, flags, null, null, null, null, null);
			if (objh == null) 
			{
				Console.WriteLine("Działanie CreateInstance nie powiodło się");
				return;
			}

			// Odpakowanie obiektu
			Object obj = objh.Unwrap();

			// Rzutowanie do aktualnego typu
			Fault f = (Fault)obj;

			Console.WriteLine("W domenie aplikacji: {0} wątek {1}", Thread.GetDomain().FriendlyName, Thread.CurrentThread.GetHashCode());

			try
			{
				// Wywołanie metody
				// f.DivideZero();
				f.Exception();
			}
			catch(Exception e)
			{
				Console.WriteLine(e.ToString());
			}

			// Oczyszczenie poprzez usunięcie domeny aplikacji z pamięci
			AppDomain.Unload(dom);  

		}
	}
}
