Удобнее всего использовать Lua в C#, так как этот язык поддерживает рефлексию.
С помощью nuget нужно добавить в проект NLua.
Для обеспечения доступа к объектам программы достаточно одного оператора:\
``lua["myobj"]=myobj;``\
После этого можно обращаться в Lua-скрипте к полям ``myobj.field``, а к методам ``myobj:method(arg)``.
Также работает обратный вариант:\
``string s=(string)lua["luavar"];``
Примерная программа выглядит так:
```c#
using System;
using System.Drawing;
// ...
using NLua;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private Lua lua;
private LuaFunction luafunc;
public Form1()
{ InitializeComponent();
lua = new Lua();
// Кодировка для файла c программой и передаваемых в Lua строк
lua.State.Encoding=Encoding.GetEncoding(1251); // или Encoding.UTF8
// регистрация функций на C# в Lua как глобальных
lua.RegisterFunction("RGBColor", this, typeof(Form1).GetMethod("RGBColor"));
// регистрация объектов C# как глобальных объектов в Lua
lua["label1"]=label1;
// загрузка функций на Lua
lua.DoFile("library.lua");
// получение адреса функции для ускорения вызова
luafunc=lua.GetFunction("func2");
}
public Color RGBColor(int r, int g, int b)
{ return Color.FromArgb(r, g, b);
}
private void button1_Click(object sender, EventArgs e)
{ double x=1.0;
// Выполнение любого оператора
lua.DoString("func1()");
// Вызов Lua-функции с аргументами и возврат результата
object[] res=luafunc.Call("text",x);
x=(double)res[0]; // функция возвращает одно вещественное число
}
}
}
```
Программа на Lua:
```lua
function func1()
label1.ForeColor=RGBColor(255,0,0) -- изменение цвета
end
function func2(a,b)
label1.Text=a -- изменение текста
return b*2
end
```