public static IntPtr NativeLayoutSignature(this RuntimeSignature signature) { if (!signature.IsNativeLayoutSignature) Environment.FailFast("Not a valid native layout signature"); NativeReader reader = TypeLoaderEnvironment.Instance.GetNativeLayoutInfoReader(signature); return reader.OffsetToAddress(signature.NativeLayoutOffset); }
// Parse a native layout info blob into a type / method given a signature pointer in the executable image private object TryParseNativeSignature(TypeSystemContext typeSystemContext, ref IntPtr signature, RuntimeTypeHandle[] typeGenericArgumentHandles, RuntimeTypeHandle[] methodGenericArgumentHandles, bool isMethodSignature) { IntPtr moduleHandle = RuntimeAugments.GetModuleFromPointer(signature); NativeReader reader = GetNativeLayoutInfoReader(moduleHandle); uint offset = reader.AddressToOffset(signature); NativeParser parser = new NativeParser(reader, offset); object retObject = TryParseNativeSignatureWorker(typeSystemContext, moduleHandle, ref parser, typeGenericArgumentHandles, methodGenericArgumentHandles, isMethodSignature); signature = reader.OffsetToAddress(parser.Offset); return retObject; }