4

LuaInterfaceという名前のアセンブリを使用して、C# アプリケーション内で lua コードを実行しています。lua の実行中に、いくつかの WinForms を作成し、イベント ハンドラー (lua メソッド) をそれらにマップします。

問題は、doString(別名runLuaCode) メソッドが init ルーチンとコンストラクターのみを実行することです。これは意図的で問題ありませんが、doString関数はノンブロッキングで動作するため、Lua で作成されたフォームがまだそこにある間に関数が返されます。これは、コンストラクター中に発生しない例外 (null-ref など) が lua エラー処理によって処理されず、エディターの wndProc までずっとクラッシュすることを意味します - ほとんどの場合、エディターが強制終了され、エラー処理が行われます。事実上不可能です。

このサブタスクだけが例外を処理する必要があるように、独自の WndProc を処理する新しい Thread / Process / AppDomain を作成する方法はありますか?

フォームが閉じられるまで、lua で while ループを使用して doString でエディターをブロックする必要がありますか?

他にどのようなオプションがありますか?

この問題に関するアドバイスは大歓迎です!

4

1 に答える 1

0

もう一人のLuaマニア!! ついに!:) また、Lua を使用して .NET アプリのマクロ スクリプトを作成するというアイデアも考えています。

よくわかりません。サンプルコードを書きましたが、問題なく動作しているようです。DoString を単純に try catch すると、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

お役に立てば幸いです。:)

于 2011-02-22T13:44:36.277 に答える