我正在使用一个名为LuaInterface的程序集在我的C#应用​​程序中运行lua代码。在lua执行期间,我为其创建了一些WinForms和映射事件处理程序(lua方法)。

问题在于doString(又名runLuaCode)方法仅运行init例程和构造函数。这很好并且可以实现,但是doString函数可进行非阻塞操作,因此当Lua创建的Forms仍然存在时,该函数将返回。这意味着lua错误不会处理在构造函数期间未引发的任何异常(null-ref等),直到我的Editor的wndProc崩溃为止-这很可能会杀死我的编辑器并进行错误处理几乎是不可能的。

有什么方法可以创建一个新的Thread/Process/AppDomain来处理自己的WndProc,以便仅此子任务需要处理异常?

我是否应该在lua中使用while循环在doString处阻止我的Editor,直到关闭表单?

我还有什么其他选择?

对此问题的任何建议,将不胜感激!

最佳答案

另一个Lua爱好者!最后! :)我也想在我的.NET应用程序中使用Lua进行宏脚本的想法。

我不确定我明白了。我写了一些示例代码,看来工作正常。简单尝试绕过DoString即可获取LuaExceptions。 DoString确实会阻塞主线程,除非您显式创建新线程。如果是新线程,则适用常规.NET多线程异常处理规则。

例子:

public const string ScriptTxt = @"
luanet.load_assembly ""System.Windows.Forms""
luanet.load_assembly ""System.Drawing""

Form = luanet.import_type ""System.Windows.Forms.Form""
Button = luanet.import_type ""System.Windows.Forms.Button""
Point = luanet.import_type ""System.Drawing.Point""
MessageBox = luanet.import_type ""System.Windows.Forms.MessageBox""
MessageBoxButtons = luanet.import_type ""System.Windows.Forms.MessageBoxButtons""

form = Form()
form.Text = ""Hello, World!""
button = Button()
button.Text = ""Click Me!""
button.Location = Point(20,20)
button.Click:Add(function()
        MessageBox:Show(""Clicked!"", """", MessageBoxButtons.OK) -- this will throw an ex
    end)
form.Controls:Add(button)
form:ShowDialog()";

        private static void Main(string[] args)
        {
            try
            {
                var lua = new Lua();
                lua.DoString(ScriptTxt);
            }
            catch(LuaException ex)
            {
                Console.WriteLine(ex.Message);
            }
            catch(Exception ex)
            {
                if (ex.Source == "LuaInterface")
                {
                    Console.WriteLine(ex.Message);
                }
                else
                {
                    throw;
                }
            }

            Console.ReadLine();
        }

LuaInterface有一个很好的文档,其中解释了棘手的错误处理。

http://penlight.luaforge.net/packages/LuaInterface/#T6

希望对您有所帮助。 :)

10-01 11:31