コード例 #1
0
        public bool TryInvokeMember(string name, object[] argsOrig, out object result, List <int> changedParameters, out string error)
        {
            error = null;
            if (IndexInStorage == 0 && name == "ОчиститьСсылку")
            {
                if (argsOrig[0] is AutoWrap temp)
                {
                    ObjectsList.RemoveKey(temp.IndexInStorage);
                }
                result = null;
                return(true);
            }

            result = null;
            object[] args = GetArrayRealObjects(argsOrig);

            try
            {
                object obj;
                if (IsDynamic)
                {
                    obj = DynamicInvoker.InvokeMember(Object, name, args);
                }
                else
                {
                    var method = InformationOnTheTypes.FindMethod(Type, IsType, name, args);

                    if (method == null)
                    {
                        if (name == "_as")
                        {
                            obj = NetObjectToNative.GetInterface(Object, args[0]);
                        }
                        else if (!ExtensionMethod.ExecuteExtensionMethod(this, name, args, out obj) &&
                                 !ExecuteInterfaceMethodAsObject(name, args, out obj, ref error))
                        {
                            error += " Не найден метод " + name;
                            return(false);
                        }
                    }
                    else
                    {
                        obj = method.ExecuteMethod(IsType ? null : Object, args);
                    }
                }
                SetChangeInArgs(argsOrig, args, changedParameters);
                result = obj;
            }
            catch (Exception e)
            {
                error = GetExceptionString("методе", name, e);

                return(false);
            }

            // Так как параметры могут изменяться (OUT) и передаются по ссылке
            // нужно обратно обернуть параметры

            return(true);
        }
コード例 #2
0
        public GenericExecutor(AutoWrap wrap, object[] arguments)
        {
            _arguments = new Type[arguments.Length];

            for (int i = 0; i < arguments.Length; i++)
            {
                _arguments[i] = NetObjectToNative.FindTypeForCreateObject(arguments[i]);
            }

            _wrap = wrap;
        }