PDA

مشاهده نسخه کامل : فراخوانی توابع ثبت شده در لوا درون سی شارپ



SajjadKhati
10-05-18, 11:00
سلام
موتور لوا (در کلاس زیر ، نسخه 5.1) :

Only the registered members can see the link

قابلیت ثبت کردن توابع (حتی متدهای سی شارپ) را در خودش داره .
کلاسی که در زیر پیوست میکنم ، حاوی توابع فراخونی کننده ی C Api در لوا هست :

Lua 5.1 Reference Manual - contents (Only the registered members can see the link)

چیزی که متوجه شدم اینه که تابعی که در لوا ثبت میشه ، فقط برای همون شی ای که ثبت اش کرد انگار در دسترس هه . برای بقیه ی اشیاء انگار در دسترس نیست . کد زیر را ببینین :



private void button3_Click(object sender, EventArgs e)
{
IntPtr luaState = LuaCSharp.lua_open();
LuaCSharp.lua_register(luaState, "LuaFunc", (LuaCSharp.LuaFunction)FormTest2.LuaFunc);
int errCheck = LuaCSharp.luaL_dostring(luaState, "LuaFunc();");
MessageBox.Show(errCheck.ToString());
LuaCSharp.lua_close(luaState);


/////////////////////////////////////

IntPtr luaState_2 = LuaCSharp.lua_open();
int errCheck_2 = LuaCSharp.luaL_dostring(luaState_2, "LuaFunc();");
MessageBox.Show(errCheck_2.ToString(), "luaState_2");
LuaCSharp.lua_close(luaState_2);
}


public static int LuaFunc(IntPtr luaState)
{
MessageBox.Show("Test");
return 0;
}

تابع LuaFunc برای ثبت در لوا ، نوشته شد
اولین بار لوا را باز و در شی luaState ذخیره کردم . با همین شی ، تابع LuaFunc را در لوا ذخیره و بعدش با luaL_dostring اجرا کردم که تابع با موفقیت اجرا شد (بنابراین پیام دیالوگ مسیج رشته ی "Test" را داد)
اما بعد که یه شی دیگه از لوا ساختم و در luaState_2 ذخیره کردم (این بار دیگه تابع را ثبت نکردم چون در کد قبلی ثبت شده بود) ، دیگه تابع LuaFunc اجرا نشد و تابع luaL_dostring مقدار غیر از صفر (که به معنای ارور هست) را برگردوند
این نشون میده بصورت شی گرا و صرفا در همون لحظه اون تابع در لوا ثبت میشه و بصورت استاتیک ثبت نمیشه . اگه این طوری باشه (که فکر کنم یه راهی داشته باشه ولی اون راه را نمیدونم)، کارایی نداره در جاهای دیگه و در دسترس قرار نمیگیره .

کلا با چه روشی میشه تابع ثبت شده در لوا را توسط هر شی (خروجی متد lua_open) فراخونی کرد؟ یعنی تابع ثبت شده ، بصورت استاتیک در دسترس باشه و وابسته به شی خاصی نباشه؟
مگه روش ثبت یا روش فراخونی دیگه ای وجود داره؟