예제 #1
0
        internal void Write(PEWriter output)
        {
            if (Diag.DiagOn) Console.WriteLine("Writing header flags = " + Hex.Short(headerFlags));
              if (tinyFormat) {
            if (Diag.DiagOn) Console.WriteLine("Writing tiny code");
            output.Write((byte)headerFlags);
              }
              else {
            if (Diag.DiagOn) Console.WriteLine("Writing fat code");
            output.Write(headerFlags);
            output.Write((ushort)maxStack);
            output.Write(offset);
            output.Write(localSigIx);
              }
              if (Diag.DiagOn) {
            Console.WriteLine(Hex.Int(tide) + " CIL instructions");
            Console.WriteLine("starting instructions at " + output.Seek(0, SeekOrigin.Current));
              }

              // Added to enable PDB generation
              if (output.pdbWriter != null) {

            // Open the method
            output.pdbWriter.OpenMethod((int)thisMeth.Token());

            // Check if this is the entry point method
            if (thisMeth.HasEntryPoint()) output.pdbWriter.SetEntryPoint((int)thisMeth.Token());
              }

              // Write out each memember of the buffer
              for (int i = 0; i < tide; i++) {
            buffer[i].Write(output);
              }

              // Added to enable PDB generation
              if (output.pdbWriter != null && tide > 0) {
            output.pdbWriter.CloseMethod();
              }
              if (Diag.DiagOn) Console.WriteLine("ending instructions at " + output.Seek(0, SeekOrigin.Current));
              for (int i = 0; i < paddingNeeded; i++) { output.Write((byte)0); }
              if (exceptions != null) {
            // Console.WriteLine("Writing exceptions");
            // Console.WriteLine("header = " + Hex.Short(exceptHeader) + " exceptSize = " + Hex.Int(exceptSize));
            output.Write(exceptHeader);
            output.Write3Bytes((uint)exceptSize);
            foreach (object exception in exceptions)
            {
            TryBlock tryBlock = (TryBlock)exception;
            tryBlock.Write(output, fatExceptionFormat);
            }
              }
        }