Чтобы определить метод в 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 → обычная функция С#.
Спасибо.
