Чтобы определить метод в C, вызываемый Lua, он должен соответствовать заданной сигнатуре и использовать Lua API для извлечения параметров и возврата результатов. Я пишу обертку С# Lua, и я заинтересован в возможности вызова произвольных методов С#, не заставляя их следовать этим соглашениям. При обертывании чего-то типа D, можно использовать систему шаблонов для динамического создания этого кода клея для любого данного метода. Я думал, что это возможно и в С#, но с использованием динамического генерации кода.
API C выглядит примерно так, и сгенерированный код будет манипулировать этим через часть более низкого уровня моей библиотеки, которая P/вызывает библиотеку Lua C.
static int foo (lua_State *L)
{
int n = lua_gettop(L); /* number of arguments */
lua_Number sum = 0;
int i;
for (i = 1; i <= n; i++)
{
if (!lua_isnumber(L, i))
{
lua_pushstring(L, "incorrect argument");
lua_error(L);
}
sum += lua_tonumber(L, i);
}
lua_pushnumber(L, sum/n); /* first result */
lua_pushnumber(L, sum); /* second result */
return 2; /* number of results */
}
Таким образом, в основном идея состоит в том, чтобы взять метод С#, отразить его параметры и вернуть значения, сгенерировать (или извлечь из кеша) метод, который использует API Lua, как описано выше, для передачи этих параметров и возврата этих возвращаемых типов и, наконец, метод для Lua. Поэтому, когда функция С# вызывается из Lua, она выглядит как lua - > magic wrapper function → обычная функция С#.
Спасибо.