// See the ECMA CLI spec, Partition II, section 23.2.1. private MiniParameterInfo[] ParseSig(byte[] sig) { PEFileReader peFile = _assembly.PEFileReader; peFile.InitMetaData(); MDTables MetaData = peFile.MetaData; uint i = 0; // The first byte of the Signature holds bits for HASTHIS, EXPLICITTHIS // and calling convention (DEFAULT, VARARG, or GENERIC). These are OR'ed // together. i++; uint numParams = DecodeInteger(sig, ref i); // Skip over return type // Skip custom modifiers. do { if (sig[i] == (byte)CorElementType.CModOpt) { i++; } else if (sig[i] == (byte)CorElementType.CModReqd) { i++; } else { break; } } while (true); // Skip return type. Note that for constructors, it should be void. if (sig[i] == (byte)CorElementType.Void) { i++; } else if (sig[i] == (byte)CorElementType.TypedByRef) { i++; } else { if (sig[i] == (byte)CorElementType.ByRef) { i++; } ParseType(sig, ref i, false, true); } MiniParameterInfo[] parameters = new MiniParameterInfo[numParams]; for (uint paramNum = 0; paramNum < numParams; paramNum++) { parameters[paramNum] = ParseType(sig, ref i, false, false); //Console.WriteLine("Read a parameter: {0}", parameters[paramNum]); } return(parameters); }
public MiniConstructorInfo(MiniParameterInfo[] parameters) { System.Diagnostics.Contracts.Contract.Requires(parameters != null); _parameters = parameters; }