static AssemblyDefinition GetAssembly(ImageReader irv, bool manifestOnly)
        {
            StructureReader    srv = new StructureReader(irv, manifestOnly);
            AssemblyDefinition asm = new AssemblyDefinition(
                new AssemblyNameDefinition(), srv);

            asm.Accept(srv);
            return(asm);
        }
		static AssemblyDefinition GetAssembly (ImageReader irv, bool manifestOnly)
		{
			StructureReader srv = new StructureReader (irv, manifestOnly);
			AssemblyDefinition asm = new AssemblyDefinition (
				new AssemblyNameDefinition (), srv);

			asm.Accept (srv);
			return asm;
		}
 static void WriteAssembly(AssemblyDefinition asm, BinaryWriter bw)
 {
     asm.Accept(new StructureWriter(asm, bw));
 }
		static void WriteAssembly (AssemblyDefinition asm, BinaryWriter bw)
		{
			asm.Accept (new StructureWriter (asm, bw));
		}
		public void Link ()
		{
			outputAssembly = AssemblyFactory.GetAssembly (Assemblies [0]);
			mainModule = outputAssembly.MainModule;
			if (mainModule.Name != MainModuleName) {
				Console.Error.WriteLine ("Main module is not named \"" + MainModuleName + "\" in assembly " + outputAssembly.Name.FullName);
				Environment.Exit (1);
			}
			mainType = mainModule.Types [MainTypeName];
			if (mainType == null) {
				Console.Error.WriteLine ("Main module does not contain type \"" + MainTypeName + "\" in assembly " + outputAssembly.Name.FullName);
				Environment.Exit (1);
			}
			outputAssembly.Accept (new StructureMerger (this, outputAssembly, outputAssembly));

			for (int i = 1; i < Assemblies.Count; i++) {
				AssemblyDefinition asm = AssemblyFactory.GetAssembly (Assemblies [i]);
				asm.Accept (new StructureMerger (this, outputAssembly, asm));
			}

			FixReflectionAfterMerge fix = new FixReflectionAfterMerge (this, outputAssembly, outputAssembly);
			fix.Process ();

			nativeLibraries.AddExternalMethods (this);

			if (OutputIsExecutable) {
				outputAssembly.Kind = AssemblyKind.Console;
				outputAssembly.EntryPoint = InternalSymbols.EntryPoint;
			} else {
				outputAssembly.Kind = AssemblyKind.Dll;
			}
			AssemblyFactory.SaveAssembly (outputAssembly, OutputPath);
		}