Exemplo n.º 1
0
        public static unsafe int Cs(IntPtr clientData, IntPtr interp, int objc, IntPtr *argv)
        {
            Program.mainInterpreter.ErrorMessage = "";

            if (objc < 3)
            {
                Program.mainInterpreter.ErrorMessage =
                    "Not enough parameters provided for the command." + NL +
                    "Correct command format: 'cs $object $member $parameters'." + NL +
                    "For more info type 'cshelp'.";
                return(TclInterpreter.TCL_ERROR);
            }

            Type   objType = null;
            object obj     = TclAPI.FindCsObject(argv[1]);

            if (obj == null)
            {
                string str = TclAPI.GetCsString(argv[1]);

                objType = TclAPI.GetCsTypeFromName(str);

                if (objType == null)
                {
                    Program.mainInterpreter.ErrorMessage =
                        "The parameter '" + str + "' could not be linked to any C# object or type.";
                    return(TclInterpreter.TCL_ERROR);
                }
            }
            else
            {
                objType = obj.GetType();
            }

            object result = null;

            // Required data - can be Method or Property
            string requiredMember = TclAPI.GetCsString(argv[2]);
            IEnumerable <MemberInfo> candidates =
                objType.GetMembers().Where(m => m.Name == requiredMember && TclAPI.IsAPICompatibleMember(m));

            // Method
            if (candidates.FirstOrDefault() is MethodInfo)
            {
                int totalParams = objc - 3;

                IEnumerable <MethodInfo> matchedMethods = candidates.Where(m => m.MemberType == MemberTypes.Method)
                                                          .Cast <MethodInfo>().Where(m => m.GetParameters().Count() == totalParams);

                // Convert the tcl parameters to cs objects
                object[] parameters = new object[totalParams];
                for (int i = 0; i < totalParams; i++)
                {
                    object csObj = TclAPI.Tcl2Cs(argv[3 + i]);
                    if (csObj == null)
                    {
                        string args = "Parameters:" + Environment.NewLine;
                        for (int j = 0; j < objc; j++)
                        {
                            args += j + ": " + TclAPI.GetCsString(argv[j]) + Environment.NewLine;
                        }
                        throw new ArgumentException("Invalid parameter provided at index: " + (3 + i).ToString() + Environment.NewLine + args);
                    }
                    parameters[i] = csObj;
                }

                // Try the candidate methods until one works
                bool success = false;
                foreach (MethodInfo method in matchedMethods)
                {
                    try
                    {
                        result = method.Invoke(obj, parameters);

                        /*if(result != null && !result.GetType().Equals(method.ReturnType))
                         *  Console.WriteLine("Type Difference");*/
                        success = true;
                        break;
                    }
                    catch (Exception) { }
                }

                // If invoked method was void
                if (success)
                {
                    if (result == null)
                    {
                        TclDLL.Tcl_ResetResult(interp);
                        return(0);
                    }
                }
                else
                {
                    Program.mainInterpreter.ErrorMessage +=
                        "No method overload could be executed for the method " + requiredMember + NL;
                }
            }
            // Property
            else if (candidates.Count() == 1 && candidates.FirstOrDefault() is PropertyInfo p)
            {
                result = p.GetValue(obj, null);
            }

            TclDLL.Tcl_SetObjResult(interp, TclAPI.Cs2Tcl(result));

            if (result == null)
            {
                Program.mainInterpreter.ErrorMessage +=
                    "'" + requiredMember + "' returned null.";
                return(TclInterpreter.TCL_WARNING);
            }

            return(0);
        }
Exemplo n.º 2
0
        public static unsafe int Test(IntPtr clientData, IntPtr interp, int objc, IntPtr *argv)
        {
            TclAPI.Tcl2Cs(argv[1]);

            return(0);
        }