static PropertyInfo GetBasePropertyDefinition(MonoProperty property) { MethodInfo method = property.GetGetMethod(true); if (method == null || !method.IsVirtual) { method = property.GetSetMethod(true); } if (method == null || !method.IsVirtual) { return(null); } MethodInfo baseMethod = ((MonoMethod)method).GetBaseMethod(); if (baseMethod != null && baseMethod != method) { ParameterInfo[] parameters = property.GetIndexParameters(); if (parameters != null && parameters.Length > 0) { Type[] paramTypes = new Type[parameters.Length]; for (int i = 0; i < paramTypes.Length; i++) { paramTypes[i] = parameters[i].ParameterType; } return(baseMethod.DeclaringType.GetProperty(property.Name, property.PropertyType, paramTypes)); } else { return(baseMethod.DeclaringType.GetProperty(property.Name, property.PropertyType)); } } return(null); }
RuntimePropertyInfo[] GetPropertiesByName(string name, BindingFlags bindingAttr, MemberListType listType, RuntimeType reflectedType) { var refh = new RuntimeTypeHandle(reflectedType); using (var namePtr = new Mono.SafeStringMarshal(name)) using (var h = new Mono.SafeGPtrArrayHandle(GetPropertiesByName_native(namePtr.Value, bindingAttr, listType))) { var n = h.Length; var a = new RuntimePropertyInfo [n]; for (int i = 0; i < n; i++) { var ph = new Mono.RuntimePropertyHandle(h[i]); a[i] = (RuntimePropertyInfo)MonoProperty.GetPropertyFromHandle(ph, refh); } return(a); } }
private void HandleEventSet(Event ev) { var type = ev.EventType; _engine.IsSuspended = true; logger.Trace($"HandleEventSet: {ev}"); try { switch (type) { case EventType.AssemblyLoad: HandleAssemblyLoad((AssemblyLoadEvent)ev); break; case EventType.UserBreak: if (!HandleUserBreak((UserBreakEvent)ev)) { return; } break; case EventType.Breakpoint: if (!HandleBreakPoint((BreakpointEvent)ev)) { return; } break; case EventType.Step: HandleStep((StepEvent)ev); return; case EventType.TypeLoad: var typeEvent = (TypeLoadEvent)ev; RegisterType(typeEvent.Type); TryBindBreakpoints(); break; case EventType.UserLog: UserLogEvent e = (UserLogEvent)ev; HostOutputWindowEx.WriteLaunchError(e.Message); break; case EventType.VMDeath: case EventType.VMDisconnect: Disconnect(); return; case EventType.VMStart: case EventType.ThreadStart: var domain = ev.Thread.Domain.FriendlyName; var threadId = ev.Thread.ThreadId; var newThread = new AD7Thread(_engine, ev.Thread); if (_threads.TryAdd(threadId, newThread)) { _engine.Callback.ThreadStarted(newThread); } else { logger.Error($"Thread {threadId} already added!"); } break; case EventType.ThreadDeath: var oldThreadId = ev.Thread.ThreadId; AD7Thread oldThread = null; if (!_threads.TryRemove(oldThreadId, out oldThread)) { _engine.Callback.ThreadDestroyed(oldThread, 0); } else { logger.Error($"Thread {oldThreadId} not found!"); } break; case EventType.Exception: var exEvent = ev as ExceptionEvent; var exceptionObjectMirror = exEvent.Exception; // TODO Reading properties from complex exceptions throws an exception. Why? var filter = MonoProperty.EnumOnlyFieldsFilter; IEnumDebugPropertyInfo2 propInfo; var monoProperty = new MonoProperty(exEvent.Thread.GetFrames().FirstOrDefault(), exceptionObjectMirror); var propInfo1 = new DEBUG_PROPERTY_INFO[1]; monoProperty.GetPropertyInfo(enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_ALL, 0, 10000, null, 0, propInfo1); monoProperty.EnumChildren(enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_ALL, 0, ref filter, enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_ACCESS_ALL, "", 10000, out propInfo); var sbException = new StringBuilder(); sbException.AppendLine($"Excption thrown: {exceptionObjectMirror.Type.FullName}"); var propInfoCast = propInfo as AD7PropertyEnum; foreach (var prop in propInfoCast.GetData()) { if (prop.bstrName.StartsWith("_message") || prop.bstrName.StartsWith("_innerException")) { sbException.AppendLine($"{prop.bstrName} = {prop.bstrValue}"); } } logger.Error($"Exception thrown: {sbException.ToString()}"); HostOutputWindowEx.WriteLaunchError($"Exception thrown: {sbException.ToString()}"); break; default: logger.Trace(ev); break; } } catch (Exception ex) { logger.Error(ex, $"Exception thrown in {nameof(HandleEventSet)}({ev})"); } try { if (type != EventType.VMStart) { logger.Trace($"HandleEventSet: ResumeVM ({ev})"); ResumeVM(); } } catch (VMNotSuspendedException) { if (type != EventType.VMStart && _vm.Version.AtLeast(2, 2)) { throw; } } catch (Exception ex) { logger.Error(ex); } }
internal static bool IsDefinedInternal(ICustomAttributeProvider obj, Type AttributeType) => default; // 0x00000001806828E0-0x00000001806828F0 private static PropertyInfo GetBasePropertyDefinition(MonoProperty property) => default; // 0x0000000180680F00-0x0000000180681210
static PropertyInfo GetBasePropertyDefinition (MonoProperty property) { MethodInfo method = property.GetGetMethod (true); if (method == null || !method.IsVirtual) method = property.GetSetMethod (true); if (method == null || !method.IsVirtual) return null; MethodInfo baseMethod = method.GetBaseMethod (); if (baseMethod != null && baseMethod != method) { ParameterInfo[] parameters = property.GetIndexParameters (); if (parameters != null && parameters.Length > 0) { Type[] paramTypes = new Type[parameters.Length]; for (int i=0; i < paramTypes.Length; i++) paramTypes[i] = parameters[i].ParameterType; return baseMethod.DeclaringType.GetProperty (property.Name, property.PropertyType, paramTypes); } else { return baseMethod.DeclaringType.GetProperty (property.Name, property.PropertyType); } } return null; }
internal static object get_default_value (MonoProperty prop) { throw new System.NotImplementedException(); }
public int GetResult(out IDebugProperty2 ppResult) { ppResult = new MonoProperty(null, _value, _expressionString); return(S_OK); }
internal static Type[] GetTypeModifiers (MonoProperty prop, bool optional) { throw new System.NotImplementedException(); }
internal static void get_property_info (MonoProperty prop, ref MonoPropertyInfo info, PInfo req_info) { throw new System.NotImplementedException(); }
internal static extern object get_default_value (MonoProperty prop);
internal static extern Type[] GetTypeModifiers (MonoProperty prop, bool optional);
internal static extern void get_property_info (MonoProperty prop, ref MonoPropertyInfo info, PInfo req_info);