Microsoft.JScript.LateBinding.CallCOMObject C# (CSharp) Method

CallCOMObject() private method

private CallCOMObject ( IReflect ir, String name, Object ob, Binder binder, Object arguments, ParameterModifier modifiers, CultureInfo culture, String namedParameters, bool construct, bool brackets, VsaEngine engine ) : Object
ir IReflect
name String
ob Object
binder Binder
arguments Object
modifiers System.Reflection.ParameterModifier
culture CultureInfo
namedParameters String
construct bool
brackets bool
engine Microsoft.JScript.Vsa.VsaEngine
return Object
      private static Object CallCOMObject(IReflect ir, String name, Object ob, Binder binder, Object[] arguments,
                                          ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters,
                                          bool construct, bool brackets, VsaEngine engine){
        try{
          try{
            LateBinding.Change64bitIntegersToDouble(arguments);
            BindingFlags flags =
              BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static|BindingFlags.OptionalParamBinding;
            if (construct)
              return ir.InvokeMember(name, flags|BindingFlags.CreateInstance, binder, ob, arguments, modifiers, culture, namedParameters);
            else if (brackets){
              // Expression like ob.name[args]. First try to invoke as an indexed property. If that
              // results in a ArgumentException, try to evaluate (ob.name) and then invoke
              // the default indexed property on the result.
              try {
                return ir.InvokeMember(name, flags|BindingFlags.GetProperty|BindingFlags.GetField, binder, ob, arguments, modifiers, culture, namedParameters);
              }catch(TargetInvocationException){
                Object ob1 = ir.InvokeMember(name, flags|BindingFlags.GetProperty|BindingFlags.GetField, binder, ob, new Object[0], modifiers, culture, new String[0]);
                return LateBinding.CallValue(ob1, arguments, construct, brackets, engine, ob1, binder, culture, namedParameters);
              }
            }else{
              int length = arguments == null ? 0 : arguments.Length;
              if (namedParameters != null && namedParameters.Length > 0 && (namedParameters[0].Equals("[DISPID=-613]") || namedParameters[0].Equals("this")))
                length--;
              flags |= length > 0
                ? BindingFlags.InvokeMethod | BindingFlags.GetProperty
                : BindingFlags.InvokeMethod;
              return ir.InvokeMember(name, flags, binder, ob, arguments, modifiers, culture, namedParameters);
            }
          }catch(MissingMemberException){
            if (brackets) //ob["x"]. Tried ob.Item()["x"] but failed. So return undefined.
              return null;
            else //ob("x"). Tried ob.Item()("x") but failed. Complain that ob is not a callable thing.
              throw new JScriptException(JSError.FunctionExpected);
          }catch(COMException e){
            int code = e.ErrorCode;
            if (((uint)code) == 0x80020006 || ((uint)code) == 0x80020003) //Unknown name or Member not found
              if (brackets)
                return null;
              else
                throw new JScriptException(JSError.FunctionExpected);
            if ((code & 0xFFFF0000) == 0x800A0000){
              String source = e.Source;
              if (source != null && source.IndexOf("JScript") != -1)
                throw new JScriptException(e, null);
            }
            throw e;
          }
        }catch(JScriptException e){
          if ((e.Number & 0xFFFF) == (int)JSError.FunctionExpected){
            //try to find a method on System.Object
            MemberInfo[] members = typeof(Object).GetMember(name, BindingFlags.Public|BindingFlags.Instance);
            if (members != null && members.Length > 0)
              return LateBinding.CallOneOfTheMembers(members, arguments, construct, ob, binder, culture, namedParameters, engine);
          }
          throw e;
        }
      }