示例#1
0
文件: CodeGen.cs 项目: zixing131/mono
        public void Write()
        {
            FileStream out_stream = null;

            try {
                if (ThisModule == null)
                {
                    this_module = new Module(Path.GetFileName(output_file));
                }

                out_stream = new FileStream(output_file, FileMode.Create, FileAccess.Write);
                pefile     = new PEFile(ThisAssembly != null ? ThisAssembly.Name : null, ThisModule.Name, is_dll, ThisAssembly != null, null, out_stream);
                PEAPI.Assembly asmb = pefile.GetThisAssembly();

                ThisModule.PeapiModule = pefile.GetThisModule();

                if (file_ref != null)
                {
                    file_ref.Resolve(this);
                }

                extern_table.Resolve(this);
                type_manager.DefineAll();

                if (manifestResources != null)
                {
                    foreach (ManifestResource mr in manifestResources)
                    {
                        pefile.AddManifestResource(mr);
                    }
                }

                foreach (FieldDef fielddef in global_field_table.Values)
                {
                    fielddef.Define(this);
                }

                foreach (MethodDef methoddef in global_method_table.Values)
                {
                    methoddef.Define(this);
                }

                foreach (TypeDef typedef in defcont_list)
                {
                    typedef.DefineContents(this);
                }

                if (ThisAssembly != null)
                {
                    ThisAssembly.Resolve(this, pefile.GetThisAssembly());
                }
                ThisModule.Resolve(this, pefile.GetThisModule());

                if (sub_system != -1)
                {
                    pefile.SetSubSystem((PEAPI.SubSystem)sub_system);
                }
                if (cor_flags != -1)
                {
                    pefile.SetCorFlags(cor_flags);
                }
                if (stack_reserve != -1)
                {
                    pefile.SetStackReserve(stack_reserve);
                }

                pefile.WritePEFile();

                if (symwriter != null)
                {
                    Guid guid = pefile.GetThisModule().Guid;
                    symwriter.Write(guid);
                }
            } finally {
                if (out_stream != null)
                {
                    out_stream.Close();
                }
            }
        }