public static void Main(string[] cmd_args_1938475092347027340582734) // random name doesn't interfere with my variables { // Create a global environment LuaInterface i = LuaRuntime.GetLua(); // to add an item, simply use the LuaInterface like a table i["obj"] = "sample object"; // we can set the MetaTable of item "obj", but first we must get it from // the global environment: var val = i["obj"]; // We can then print "val" Console.WriteLine(val.ToString()); // --> sample object // to register methods, use the Register function (using Addresses or delegates) i.RegisterFunction("samplefunc", null, (new Func <object>(delegate() { return(100); })).Method); // To run Lua, use the Run function in LuaRuntime // we pass "t" as the specified environment, otherwise it will // create a new environment to run in. LuaRuntime.Run(@"print(""obj:"", obj, ""\nsamplefunc:"", samplefunc())"); // we can also call .NET methods using Lua-created .NET object // such as: LuaRuntime.Run("obj2 = clr.create(\"CSharpExampleProject.TestClass\")"); // Notice the ':' in the method invocation (call)... LuaRuntime.Run("print(\"testint:\", obj2.testint, \"TestFunc:\", obj2:TestFunc())"); // the reason for this is because clr.create returns an advanced Userdata with // metatables that wrap the .net object //LuaRuntime.Run("obj2.ThisValueDoesntExistInDotNet = \"hey\"", t); // the same value was printed twice, with different functions each time, proving its not actually there: //Console.WriteLine(LuaRuntime.Run("return \"Sample attemption at creating an object: \" .. tostring(obj2.ThisValueDoesntExistInDotNet)", t)); // Console.WriteLine was used to show that you can print the returned value of executed code //LuaRuntime.Run("print(obj2.ThisValueDoesntExistInDotNet)", t); // You can also call functions defined in #Lua LuaFunction f = LuaRuntime.Run("return function() print\"a function says hai\" end")[0] as LuaFunction; f.Call(); // Another class example i["t2"] = new Test2(); LuaRuntime.Run("t2.Values:Sort() print(t2[1])"); // Let you see the output Console.Write("Press any key to continue . . . "); Console.ReadKey(true); }
public static void ConfigRead() { LuaInterface lua = LuaRuntime.GetLua(); //lua.RegisterFunction("getSSHInfo", my, my.GetType().GetMethod("getSSHInfo")); lua.DoFile(Constant.Config); object[] objs = lua.GetFunction("getSSHInfo").Call(); Constant.sshServer = objs[0].ToString(); Constant.sshPort = Int32.Parse(objs[1].ToString()); Constant.sshUID = objs[2].ToString(); Constant.sshPWD = objs[3].ToString(); }
/// <summary> /// A REPL (Read, Eval, Print, Loop function) for #Lua /// </summary> /// <param name="args">Application startup args</param> public static void Main(string[] args) { bool GoInteractive = true; // Create global variables Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); LuaRuntime.PrintBanner(); LuaRuntime.RegisterModule(typeof(TestModule)); LuaRuntime.RegisterModule(typeof(TestModule2)); // how to handle errors #if DEBUG LuaRuntime.SetVariable("DEBUG", true); #else LuaRuntime.SetVariable("DEBUG", false); #endif Prompt = "> "; LuaRuntime.GetLua().NewTable("arg"); LuaTable t = LuaRuntime.GetLua().GetTable("arg"); for (int i = 0; i < args.Length; i++) { t[i] = args[i]; } // check command line args if (args.Length > 0) { string file = args[0]; if (File.Exists(file)) { try { LuaRuntime.SetVariable("_WORKDIR", Path.GetDirectoryName(file)); LuaRuntime.RunFile(file); // it loaded successfully if (args.Length > 1) // possibly interactive mode after { Console.WriteLine("Loaded file '" + Path.GetFileName(file) + "'"); } } catch (Exception error) { Console.WriteLine(error.Message); } //Console.ReadKey(true); //return; // instead, go to interactive } else { Console.WriteLine(file + " not found."); } } // check for interactive mode foreach (string arg in args) { if (arg.ToUpper() == "-I") { GoInteractive = true; } } if (args.Length == 0) { GoInteractive = true; } if (GoInteractive) { while (true) { Console.Write(Prompt); string line = Console.ReadLine(); if (line == "quit" || line == "exit" || line == "bye") { break; } else { try { object[] v = LuaRuntime.Run(line); if (v == null || v.Length == 0) { Console.WriteLine("=> [no returned value]"); } else { Console.Write("=> "); for (int i = 0; i < v.Length; i++) { if (v[i] == null) { Console.WriteLine("<nil>"); } else { Console.Write(v[i].ToString() + (i != v.Length - 1 ? ", " : "")); } } Console.WriteLine(); } } catch (LuaSourceException ex) { for (int i = 0; i < ex.Column; i++) { Console.Write(" "); } // Offset for prompt for (int i = 0; i < Prompt.Length - 1; i++) { Console.Write(" "); } Console.WriteLine("^"); Console.WriteLine(ex.GenerateMessage("<stdin>")); } catch (Exception error) { // TODO: show lua script traceback // Possible fix... this isn't safe though. //Console.WriteLine(error.Message); // doesnt work :( //LuaRuntime.Run("pcall(function() print(debug.traceback()) end)"); //Console.WriteLine(); object dbg = LuaRuntime.GetVariable("DEBUG"); if ((dbg is bool && (bool)dbg == true) || dbg is int == false) { Console.WriteLine(error.ToString()); } else { Console.WriteLine("Error: " + error.Message); } LuaRuntime.SetVariable("LASTERROR", error); } } } } }
/// <summary> /// A REPL (Read, Eval, Print, Loop function) for #Lua /// </summary> /// <param name="args">Application startup args</param> public static void Main(string[] args) { // TODO: Better arg parsing/checking, make it more like the C lua bool GoInteractive = true; // Create global variables Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Stopwatch sw = new Stopwatch(); //sw.Start(); //sw.Stop(); //Console.WriteLine(sw.ElapsedMilliseconds); #if DEBUG #if true LuaRuntime.RegisterModule(typeof(TestModule)); LuaRuntime.RegisterModule(typeof(TestModule2)); #endif // how to handle errors //LuaRuntime.SetVariable("DEBUG", true); LuaRuntime.SetVariable("DEBUG", false); // We don't need the C# traceback. // All it is is [error] // at LuaInterface.ThrowErrorFromException // [...] // Which we don't need #else LuaRuntime.SetVariable("DEBUG", false); #endif Prompt = "> "; bool wasSetInteract = false; bool wasFileRun = false; for (int i = 0; i < args.Length; i++) { string arg = args[i]; if (arg.ToUpper() == "-I") { GoInteractive = true; wasSetInteract = true; } else if (arg.ToUpper() == "-NOI") { GoInteractive = false; } else if (arg.Substring(0, 2).ToLower() == "-l") { if (arg.Length == 2) { string lib = args[++i]; LuaRuntime.Require(lib); } else { string lib = arg.Substring(2); LuaRuntime.Require(lib); } } else if (arg.ToLower() == "-e") { if (wasSetInteract == false) { GoInteractive = true; } LuaRuntime.Run(args[++i]); if (wasSetInteract == false) { GoInteractive = false; } wasFileRun = true; } else if (arg == "--") { break; } else { LuaTable t = LuaRuntime.GetLua().NewTable("arg"); int i3 = 1; if (args.Length > i + 1) { for (int i2 = i + 1; i2 < args.Length; i2++) { t[i3++] = args[i2]; } } t[-1] = System.Windows.Forms.Application.ExecutablePath; t["n"] = t.Keys.Count; if (File.Exists(args[i])) { LuaRuntime.SetVariable("_WORKDIR", Path.GetDirectoryName(args[i])); } else { LuaRuntime.SetVariable("_WORKDIR", Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath)); } LuaRuntime.RunFile(args[i]); if (wasSetInteract == false) { GoInteractive = false; } wasFileRun = true; break; } } /* * // check command line args * if (args.Length > 0) * { * string file = args[0]; * if (File.Exists(file)) * { * try * { * LuaRuntime.SetVariable("_WORKDIR", Path.GetDirectoryName(file)); * LuaRuntime.RunFile(file); * // it loaded successfully * if (args.Length > 1 && args[1].ToUpper() != "-NOI") // possibly interactive mode after * Console.WriteLine("Loaded file '" + Path.GetFileName(file) + "'"); * } * catch (Exception error) * { * Console.WriteLine(error.Message); * } * //Console.ReadKey(true); * //return; * // instead, go to interactive * } * else * { * Console.WriteLine(file + " not found."); * } * } */ if (args.Length == 0) { GoInteractive = true; } if (GoInteractive) { if (args.Length == 0 || wasFileRun == false) { LuaRuntime.PrintBanner(); } LuaRuntime.SetVariable("_WORKDIR", Path.GetDirectoryName(typeof(Program).Assembly.Location)); while (true) { Console.Write(Prompt); string line = Console.ReadLine(); if (line == "quit" || line == "exit" || line == "bye") { break; } else { try { object[] v = LuaRuntime.GetLua().DoString(line, "<stdin>"); if (v == null || v.Length == 0) #if DEBUG { Console.WriteLine("=> [no returned value]"); } #else {; } #endif else { Console.Write("=> "); for (int i = 0; i < v.Length; i++) { if (v[i] == null) { Console.WriteLine("<nil>"); } else { Console.Write(v[i].ToString() + (i != v.Length - 1 ? ", " : "")); } } Console.WriteLine(); } }