//
// 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.Reflection;
using System.Collections;
using System.Security.Permissions;
using System.Runtime.Serialization;

namespace AssemblySample
{

	class AssemblySampleMain
	{
		static void Main(string[] args)
		{
			try
			{
				// Assembly a = Assembly.Load("SubAssembly, SN=d8d19842315c20be");
				// Assembly a = Assembly.LoadFrom(@"..\..\SubAssembly\bin\debug\SubAssembly.dll");
				// Assembly a = Assembly.LoadFrom(@"..\..\bin\debug\SubAssembly.dll");
				Console.WriteLine(Assembly.CreateQualifiedName("SubAssembly", "MyClass"));
				Assembly a = Assembly.Load("SubAssembly");
				Console.WriteLine("Lista wszystkich typów dla");
				Console.WriteLine(" {0}", a.FullName);
				Type [] types = a.GetTypes();
				foreach(Type t in types)
				{
					Console.WriteLine("Type: {0}", t);
				}
				Module [] modules = a.GetLoadedModules();
				foreach(Module m in modules)
				{
					Console.WriteLine("Załadowane moduły: {0}", m);
				}

				Console.WriteLine("CodeBase: {0}", a.CodeBase);
				Console.WriteLine("Położenie: {0}", a.Location);
				Console.WriteLine("Punkt wejścia: {0}", a.EntryPoint);
				Console.WriteLine("Liczba dowodów: {0}", a.Evidence.Count);
				IEnumerator ee = a.Evidence.GetEnumerator();
				while(ee.MoveNext())
				{
					Console.WriteLine(ee.Current);
				}
				Console.WriteLine("Plik załadowany z GAC: {0}", a.GlobalAssemblyCache);
				Object [] attributes = a.GetCustomAttributes(true);
				foreach(object o in attributes)
				{
					Console.WriteLine(o);
				}
				TypeSampler.MyClass mc = new TypeSampler.MyClass();
				Console.WriteLine("MyInt to: {0}", mc.MyInt);

				AssemblyName [] assemblyNames = a.GetReferencedAssemblies();
				foreach(AssemblyName an in assemblyNames)
				{
					Console.WriteLine("Odwołania: {0}", an.Name);
				}
				a = Assembly.GetAssembly(typeof(double));
				Console.WriteLine(a.FullName);
				a = Assembly.GetAssembly(typeof(TypeSampler.MyClass));
				Console.WriteLine(a.FullName);
			}
			catch(Exception e)
			{
				Console.WriteLine(e.ToString());
			}
		}
	}
}
