internal void applyZeroes() { flags = 0; iflags = 0; token = 0; klass = (MonoClass *)0; signature = (MonoMethodSignature *)0; name = (byte *)0; method_pointer = IntPtr.Zero; invoke_pointer = IntPtr.Zero; bitfield = 0; slot = 0; }
private static unsafe MonoMethod *IcallToFakeMonoMethod(string icallName) { string[] typeAndMethod = icallName.Split(new[] { "::" }, StringSplitOptions.None); int parenthesisIndex = typeAndMethod[1].IndexOf('('); if (parenthesisIndex >= 0) { typeAndMethod[1] = typeAndMethod[1].Substring(0, parenthesisIndex); } // We add a padding to the end of each allocated memory since our structs are supposed to be bigger than the one we have here MonoMethod *monoMethod = (MonoMethod *)Marshal.AllocHGlobal(sizeof(MonoMethod) + 0x100); monoMethod->applyZeroes(); monoMethod->klass = (MonoClass *)Marshal.AllocHGlobal(sizeof(MonoClass) + 0x100); monoMethod->klass->applyZeroes(); monoMethod->name = (byte *)Marshal.StringToHGlobalAnsi(typeAndMethod[1]); int lastDotIndex = typeAndMethod[0].LastIndexOf('.'); if (lastDotIndex < 0) { *(IntPtr *)((long)&monoMethod->klass->nested_in_0x08 + monoClassOffset) = Marshal.StringToHGlobalAnsi(""); *(IntPtr *)((long)&monoMethod->klass->nested_in_0x04 + monoClassOffset) = Marshal.StringToHGlobalAnsi(typeAndMethod[0]); } else { string name_space = typeAndMethod[0].Substring(0, lastDotIndex); string name = typeAndMethod[0].Substring(lastDotIndex + 1); *(IntPtr *)((long)&monoMethod->klass->nested_in_0x08 + monoClassOffset) = Marshal.StringToHGlobalAnsi(name_space); *(IntPtr *)((long)&monoMethod->klass->nested_in_0x04 + monoClassOffset) = Marshal.StringToHGlobalAnsi(name); } MonoMethodSignature *monoMethodSignature = (MonoMethodSignature *)Marshal.AllocHGlobal(sizeof(MonoMethodSignature)); monoMethodSignature->ApplyZeroes(); monoMethod->signature = monoMethodSignature; return(monoMethod); }
static unsafe IntPtr GetMethodSignature(MonoObject *methodobj) { var method = (MethodBase)GetMonoObjectTarget(methodobj); var parameters = method.GetParameters(); var parameterCount = parameters.Length; var rv = Marshal.AllocHGlobal(sizeof(MonoMethodSignature) + sizeof(MonoObjectPtr) * parameterCount); MonoMethodSignature *signature = (MonoMethodSignature *)rv; signature->Method = methodobj; xamarin_mono_object_retain(methodobj); signature->ParameterCount = parameterCount; signature->ReturnType = (MonoObject *)GetMonoObject(GetMethodReturnType(method)); MonoObject **mparams = &signature->Parameters; for (var i = 0; i < parameterCount; i++) { var p = parameters [i]; mparams [i] = (MonoObject *)GetMonoObject(p.ParameterType); } return(rv); }