public static SharpAssembly LoadFrom(string filename, bool fromGAC)
		{
			// lock the assembly object in case that the preload thread is conflicting with another
			lock (typeof(SharpAssembly)) {
				AssemblyReader read = new AssemblyReader();
				read.Load(filename);
				
				SharpAssembly asm = new SharpAssembly(read, fromGAC);
				asm.LoadReferences();
				asm.LoadNestedTypeTable();
				asm.LoadAttributeTable();
				asm.LoadFieldConstants();
				
				return asm;
			}
		}
		public static SharpAssemblyName GetNameOfReference(AssemblyReader asm, uint AsmRefIndex)
		{
			SharpAssemblyName name = new SharpAssemblyName();

			if ((AssemblyRef[])asm.MetadataTable.Tables[AssemblyRef.TABLE_ID] == null) return name;
			
			AssemblyRef aref = ((AssemblyRef[])asm.MetadataTable.Tables[AssemblyRef.TABLE_ID])[AsmRefIndex];
			
			name.Name      = asm.GetStringFromHeap(aref.Name);
			name.Version   = new Version(aref.Major, aref.Minor, aref.Build, aref.Revision);
			name.Culture   = asm.GetStringFromHeap(aref.Culture);
			name.Flags     = aref.Flags;
			name.PublicKey = asm.GetBlobFromHeap(aref.PublicKeyOrToken);
			
			return name;
		}
		internal SharpAssembly(AssemblyReader Reader, bool FromGac)
		{
			reader = Reader;
			tables = new MetadataTables(reader);
			
			// cache Name object
			internalName = GetAssemblyName();
			fromGAC = FromGac;
			
			fullNamePool[this.FullName] = this;
			if (!shortNamePool.ContainsKey(this.Name)) {
				shortNamePool[this.Name]    = this;
			}
		}
		public static SharpAssemblyName GetAssemblyName(AssemblyReader asm)
		{
			SharpAssemblyName name = new SharpAssemblyName();

			if ((Rows.Assembly[])asm.MetadataTable.Tables[Rows.Assembly.TABLE_ID] == null) return name;
			
			Rows.Assembly arow = ((Rows.Assembly[])asm.MetadataTable.Tables[Rows.Assembly.TABLE_ID])[1];
			
			name.Name      = asm.GetStringFromHeap(arow.Name);
			name.Version   = new Version(arow.MajorVersion, arow.MinorVersion, arow.BuildNumber, arow.RevisionNumber);
			name.Culture   = asm.GetStringFromHeap(arow.Culture);
			name.Flags     = arow.Flags;
			name.PublicKey = asm.GetBlobFromHeap(arow.PublicKey);
			
			return name;
		}
 public MetadataTables(AssemblyReader Reader)
 {
     reader = Reader;
 }