public static void LateIndexSet(object o, object[] args, string[] paramnames) { string defaultName = null; if (o == null) { throw ExceptionUtils.VbMakeException(0x5b); } Type objType = o.GetType(); IReflect correctIReflect = GetCorrectIReflect(o, objType); if (objType.IsArray) { if ((paramnames != null) && (paramnames.Length != 0)) { throw new ArgumentException(Utils.GetResourceString("Argument_InvalidNamedArgs")); } Array array = (Array) o; int index = args.Length - 1; object obj2 = args[index]; if (obj2 != null) { Type elementType = objType.GetElementType(); if (obj2.GetType() != elementType) { obj2 = ObjectType.CTypeHelper(obj2, elementType); } } if (index != array.Rank) { throw new RankException(); } if (index == 1) { array.SetValue(obj2, Conversions.ToInteger(args[0])); } else if (index == 2) { array.SetValue(obj2, Conversions.ToInteger(args[0]), Conversions.ToInteger(args[1])); } else { int[] indices = new int[(index - 1) + 1]; int num5 = index - 1; for (int i = 0; i <= num5; i++) { indices[i] = Conversions.ToInteger(args[i]); } array.SetValue(obj2, indices); } } else { MethodBase[] match = null; BindingFlags invokeAttr = BindingFlags.OptionalParamBinding | BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase; if (objType.IsCOMObject) { CheckForClassExtendingCOMClass(objType); invokeAttr |= GetPropertyPutFlags(args[args.GetUpperBound(0)]); } else { int num3; int num4; invokeAttr |= BindingFlags.SetProperty; if (args.Length == 1) { invokeAttr |= BindingFlags.SetField; } MemberInfo[] infoArray = GetDefaultMembers(objType, correctIReflect, ref defaultName); if (infoArray != null) { int upperBound = infoArray.GetUpperBound(0); for (num3 = 0; num3 <= upperBound; num3++) { MemberInfo setMethod = infoArray[num3]; if (setMethod.MemberType == MemberTypes.Property) { setMethod = ((PropertyInfo) setMethod).GetSetMethod(); } if ((setMethod != null) && (setMethod.MemberType != MemberTypes.Field)) { infoArray[num4] = setMethod; num4++; } } } if ((infoArray == null) | (num4 == 0)) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_NoDefaultMemberFound1", new string[] { Utils.VBFriendlyName(objType, o) })); } match = new MethodBase[(num4 - 1) + 1]; int num7 = num4 - 1; for (num3 = 0; num3 <= num7; num3++) { try { match[num3] = (MethodBase) infoArray[num3]; } catch (StackOverflowException exception) { throw exception; } catch (OutOfMemoryException exception2) { throw exception2; } catch (ThreadAbortException exception3) { throw exception3; } catch (Exception) { } } } VBBinder binder = new VBBinder(null); try { if (objType.IsCOMObject) { binder.InvokeMember("", invokeAttr, objType, correctIReflect, o, args, paramnames); } else { object objState = null; binder.m_BindToName = defaultName; binder.m_objType = objType; MethodBase member = binder.BindToMethod(invokeAttr, match, ref args, null, null, paramnames, ref objState); VBBinder.SecurityCheckForLateboundCalls(member, objType, correctIReflect); if (((objType == correctIReflect) || member.IsStatic) || DoesTargetObjectMatch(o, member)) { VerifyObjRefPresentForInstanceCall(o, member); member.Invoke(o, args); } else { InvokeMemberOnIReflect(correctIReflect, member, BindingFlags.InvokeMethod, o, args); } binder.ReorderArgumentArray(ref args, objState); } } catch when (?) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_NoDefaultMemberFound1", new string[] { Utils.VBFriendlyName(objType, o) })); } catch (TargetInvocationException exception5) { throw exception5.InnerException; } } }
public static object LateGet(object o, Type objType, string name, object[] args, string[] paramnames, bool[] CopyBack) { object obj2; BindingFlags invokeAttr = BindingFlags.OptionalParamBinding | BindingFlags.GetProperty | BindingFlags.InvokeMethod | BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase; if (objType == null) { if (o == null) { throw ExceptionUtils.VbMakeException(0x5b); } objType = o.GetType(); } IReflect correctIReflect = GetCorrectIReflect(o, objType); if (name == null) { name = ""; } if (objType.IsCOMObject) { CheckForClassExtendingCOMClass(objType); } else { MemberInfo member = GetMostDerivedMemberInfo(correctIReflect, name, invokeAttr | BindingFlags.GetField); if ((member != null) && (member.MemberType == MemberTypes.Field)) { object obj3; VBBinder.SecurityCheckForLateboundCalls(member, objType, correctIReflect); if (((objType == correctIReflect) || ((FieldInfo) member).IsStatic) || DoesTargetObjectMatch(o, member)) { VerifyObjRefPresentForInstanceCall(o, member); obj3 = ((FieldInfo) member).GetValue(o); } else { obj3 = InvokeMemberOnIReflect(correctIReflect, member, BindingFlags.GetField, o, null); } if ((args != null) && (args.Length != 0)) { return LateIndexGet(obj3, args, paramnames); } return obj3; } } VBBinder binder = new VBBinder(CopyBack); try { obj2 = binder.InvokeMember(name, invokeAttr, objType, correctIReflect, o, args, paramnames); } catch when (?) { if (objType.IsCOMObject || ((args != null) && (args.Length > 0))) { object obj4; invokeAttr = BindingFlags.OptionalParamBinding | BindingFlags.GetProperty | BindingFlags.InvokeMethod | BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase; if (!objType.IsCOMObject) { invokeAttr |= BindingFlags.GetField; } try { obj4 = binder.InvokeMember(name, invokeAttr, objType, correctIReflect, o, null, null); } catch (AccessViolationException exception2) { throw exception2; } catch (StackOverflowException exception3) { throw exception3; } catch (OutOfMemoryException exception4) { throw exception4; } catch (ThreadAbortException exception5) { throw exception5; } catch (Exception) { obj4 = null; } if (obj4 == null) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_MemberNotFoundOnType2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } try { return LateIndexGet(obj4, args, paramnames); } catch when (?) { Exception exception; throw exception; } } throw new MissingMemberException(Utils.GetResourceString("MissingMember_MemberNotFoundOnType2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } catch (TargetInvocationException exception7) { throw exception7.InnerException; } return obj2; }
internal static void InternalLateSet(object o, ref Type objType, string name, object[] args, string[] paramnames, bool OptimisticSet, CallType UseCallType) { BindingFlags invokeAttr = BindingFlags.OptionalParamBinding | BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase; if (objType == null) { if (o == null) { throw ExceptionUtils.VbMakeException(0x5b); } objType = o.GetType(); } IReflect correctIReflect = GetCorrectIReflect(o, objType); if (name == null) { name = ""; } if (objType.IsCOMObject) { CheckForClassExtendingCOMClass(objType); if (UseCallType == CallType.Set) { invokeAttr |= BindingFlags.PutRefDispProperty; if (args[args.GetUpperBound(0)] == null) { args[args.GetUpperBound(0)] = new DispatchWrapper(null); } } else if (UseCallType == CallType.Let) { invokeAttr |= BindingFlags.PutDispProperty; } else { invokeAttr |= GetPropertyPutFlags(args[args.GetUpperBound(0)]); } } else { invokeAttr |= BindingFlags.SetProperty; MemberInfo member = GetMostDerivedMemberInfo(correctIReflect, name, invokeAttr | BindingFlags.SetField); if ((member != null) && (member.MemberType == MemberTypes.Field)) { FieldInfo info2 = (FieldInfo) member; if (info2.IsInitOnly) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_ReadOnlyField2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } if ((args == null) || (args.Length == 0)) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_MemberNotFoundOnType2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } if (args.Length == 1) { object obj3; object obj2 = args[0]; VBBinder.SecurityCheckForLateboundCalls(info2, objType, correctIReflect); if (obj2 == null) { obj3 = null; } else { obj3 = ObjectType.CTypeHelper(args[0], info2.FieldType); } if (((objType == correctIReflect) || info2.IsStatic) || DoesTargetObjectMatch(o, info2)) { VerifyObjRefPresentForInstanceCall(o, info2); info2.SetValue(o, obj3); return; } InvokeMemberOnIReflect(correctIReflect, info2, BindingFlags.SetField, o, new object[] { obj3 }); return; } if (args.Length > 1) { VBBinder.SecurityCheckForLateboundCalls(member, objType, correctIReflect); object obj4 = null; if (((objType == correctIReflect) || ((FieldInfo) member).IsStatic) || DoesTargetObjectMatch(o, member)) { VerifyObjRefPresentForInstanceCall(o, member); obj4 = ((FieldInfo) member).GetValue(o); } else { obj4 = InvokeMemberOnIReflect(correctIReflect, member, BindingFlags.GetField, o, new object[] { obj4 }); } LateIndexSet(obj4, args, paramnames); return; } } } VBBinder binder = new VBBinder(null); if (OptimisticSet && (args.GetUpperBound(0) > 0)) { BindingFlags bindingAttr = BindingFlags.OptionalParamBinding | BindingFlags.GetProperty | BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase; Type[] types = new Type[(args.GetUpperBound(0) - 1) + 1]; int upperBound = types.GetUpperBound(0); for (int i = 0; i <= upperBound; i++) { object obj5 = args[i]; if (obj5 == null) { types[i] = null; } else { types[i] = obj5.GetType(); } } try { PropertyInfo info3 = correctIReflect.GetProperty(name, bindingAttr, binder, typeof(int), types, null); if ((info3 != null) && info3.CanWrite) { goto Label_02BD; } } catch (MissingMemberException) { } return; } Label_02BD: try { binder.InvokeMember(name, invokeAttr, objType, correctIReflect, o, args, paramnames); } catch when (?) { Exception exception2; object obj6; if ((args == null) || (args.Length <= 1)) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_MemberNotFoundOnType2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } invokeAttr = BindingFlags.OptionalParamBinding | BindingFlags.GetProperty | BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase; if (!objType.IsCOMObject) { invokeAttr |= BindingFlags.GetField; } try { obj6 = binder.InvokeMember(name, invokeAttr, objType, correctIReflect, o, null, null); } catch when (?) { throw exception2; } catch (AccessViolationException exception4) { throw exception4; } catch (StackOverflowException exception5) { throw exception5; } catch (OutOfMemoryException exception6) { throw exception6; } catch (ThreadAbortException exception7) { throw exception7; } catch (Exception) { obj6 = null; } if (obj6 == null) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_MemberNotFoundOnType2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } try { LateIndexSet(obj6, args, paramnames); } catch when (?) { throw exception2; } } catch (TargetInvocationException exception10) { if (exception10.InnerException == null) { throw exception10; } if (!(exception10.InnerException is TargetParameterCountException)) { throw exception10.InnerException; } if ((invokeAttr & BindingFlags.PutRefDispProperty) != BindingFlags.Default) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_MemberSetNotFoundOnType2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } throw new MissingMemberException(Utils.GetResourceString("MissingMember_MemberLetNotFoundOnType2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } }
internal static object InvokeMemberOnIReflect(IReflect objIReflect, MemberInfo member, BindingFlags flags, object target, object[] args) { VBBinder binder = new VBBinder(null); binder.CacheMember(member); return objIReflect.InvokeMember(member.Name, (BindingFlags.OptionalParamBinding | BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase) | flags, binder, target, args, null, null, null); }
internal static object InternalLateCall(object o, Type objType, string name, object[] args, string[] paramnames, bool[] CopyBack, bool IgnoreReturn) { object obj2; BindingFlags flags = BindingFlags.OptionalParamBinding | BindingFlags.InvokeMethod | BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase; if (IgnoreReturn) { flags |= BindingFlags.IgnoreReturn; } if (objType == null) { if (o == null) { throw ExceptionUtils.VbMakeException(0x5b); } objType = o.GetType(); } IReflect correctIReflect = GetCorrectIReflect(o, objType); if (objType.IsCOMObject) { CheckForClassExtendingCOMClass(objType); } if (name == null) { name = ""; } VBBinder binder = new VBBinder(CopyBack); if (!objType.IsCOMObject) { MemberInfo[] mi = GetMembersByName(correctIReflect, name, flags); if ((mi == null) || (mi.Length == 0)) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_MemberNotFoundOnType2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } if (MemberIsField(mi)) { throw new ArgumentException(Utils.GetResourceString("ExpressionNotProcedure", new string[] { name, Utils.VBFriendlyName(objType, o) })); } if ((mi.Length == 1) && ((paramnames == null) || (paramnames.Length == 0))) { MemberInfo getMethod = mi[0]; if (getMethod.MemberType == MemberTypes.Property) { getMethod = ((PropertyInfo) getMethod).GetGetMethod(); if (getMethod == null) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_MemberNotFoundOnType2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } } MethodBase method = (MethodBase) getMethod; ParameterInfo[] parameters = method.GetParameters(); int length = args.Length; int num2 = parameters.Length; if (num2 == length) { if (num2 == 0) { return FastCall(o, method, parameters, args, objType, correctIReflect); } if ((CopyBack == null) && NoByrefs(parameters)) { ParameterInfo info2 = parameters[num2 - 1]; if (!info2.ParameterType.IsArray) { return FastCall(o, method, parameters, args, objType, correctIReflect); } object[] customAttributes = info2.GetCustomAttributes(typeof(ParamArrayAttribute), false); if ((customAttributes == null) || (customAttributes.Length == 0)) { return FastCall(o, method, parameters, args, objType, correctIReflect); } } } } } try { obj2 = binder.InvokeMember(name, flags, objType, correctIReflect, o, args, paramnames); } catch (MissingMemberException) { throw; } catch when (?) { throw new MissingMemberException(Utils.GetResourceString("MissingMember_MemberNotFoundOnType2", new string[] { name, Utils.VBFriendlyName(objType, o) })); } catch (TargetInvocationException exception3) { throw exception3.InnerException; } return obj2; }