//
// 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.Reflection.Emit;
using System.Runtime.InteropServices;

namespace TypeLibraryConversion
{
	/// <summary>
	/// Podsumowanie dla COMTypeLibrary.
	/// </summary>
	class COMTypeLibrary
	{
		private enum RegKind
		{
			RegKind_Default = 0,
			RegKind_Register = 1,
			RegKind_None = 2
		}
   
		[ DllImport( "oleaut32.dll", CharSet = CharSet.Unicode, PreserveSig = false )]
		private static extern void LoadTypeLibEx( String strTypeLibName, RegKind regKind, 
			[ MarshalAs( UnmanagedType.Interface )] out Object typeLib );
   
		/// <summary>
		/// Główny punkt wejścia dla aplikacji.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			Object typeLib;
			LoadTypeLibEx( "COMTypes.dll", RegKind.RegKind_None, out typeLib ); 
      
			if( typeLib == null )
			{
				Console.WriteLine( "Działanie LoadTypeLibEx nie powiodło się." );
				return;
			}
         
			TypeLibConverter c = new TypeLibConverter();
			ConversionEventHandler eventHandler = new ConversionEventHandler();
			AssemblyBuilder asm = c.ConvertTypeLibToAssembly( typeLib, "Interop.COMTypes.dll", 0, eventHandler, null, null, null, new Version("1.0.0.0") );
			asm.Save( "Interop.COMTypes.dll" );
		}
	}
	public class ConversionEventHandler : ITypeLibImporterNotifySink
	{
		public void ReportEvent( ImporterEventKind eventKind, int eventCode, string eventMsg )
		{
			// Proste zgłoszenie o wywołaniu tej metody.
			// Przypomina to opcję /verbose narzędzia tlbimp.
			Console.WriteLine("ReportEvent {0}: {1}", eventKind, eventMsg);
		}
   
		public Assembly ResolveRef( object typeLib )
		{
			// Rozwiązanie odwołań i zwrócenie właściwego podzespołu.
			Console.WriteLine("ResolveRef");
			return null; 
		}   
	}
}
