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;
 }