Пример #1
0
        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);
        }
Пример #2
0
        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);
                }
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
 internal static bool IsDefinedInternal(ICustomAttributeProvider obj, Type AttributeType) => default;                                 // 0x00000001806828E0-0x00000001806828F0
 private static PropertyInfo GetBasePropertyDefinition(MonoProperty property) => default;                                             // 0x0000000180680F00-0x0000000180681210
Пример #5
0
		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);