2011-02-09 12 views
4

LuaInterfaceというアセンブリを使用して、C#アプリケーション内でluaコードを実行しています。ルア実行中に、私はいくつかのWinForms &マップイベントハンドラ(lua-methods)を作成します。C#でLua例外をキャッチする方法

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

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

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

その他のオプションはありますか?

この問題に関するアドバイスをいただければ幸いです。

+0

申し訳ありませんが、私はそれを取得できませんか? – Corelgott

+0

よろしくお願いします...これは意図的なものではありませんでした - 申し訳ありません&ご自身のことを思い出させる - rtfm – Corelgott

+0

これを修正するのは遅くはありません;-) –

答えて

0

もう1人のLua愛好家!最後に! :)私はまた、私の.NETアプリケーションでマクロスクリプトのためにLuaを使用するアイデアを思いついています。

私には分かりません。私はいくつかのサンプルコードを書いて、それはうまく動作しているようだ。 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

私はそれが役に立てば幸い。 :)

+0

あなたの投稿をありがとう!私はスレッドをほとんど忘れてしまった!悲しいことに、私はすでに成功していないあなたの提案を試してきました.Luaスクリプトが呼び出された.Net-Functionで失敗したためです。 (例えばMessageBox:Showが例外をスローした場合)多くのフィーデリングの後、LuaInterfaceを通して適切に委譲されなかった内部例外があることがわかりました。それを「エクスポート」した後、私は必要な情報を得て、私のプログラマーがクラッシュしたところで少なくともコードヒットを提供することができます! – Corelgott

+0

NuaはLuaの.NET実装であり、動的言語ランタイム(DLR)http://nua.codeplex.com/を使用して調べる価値があります。Iron PythonとIron RubyもDLRを使用しています。これは100%.NETフレームワークなので、エキゾチックなマーシャルエラーに遭遇することはありません。これは価値のあるプロジェクトです。 –

関連する問題