Para definir un método en C que sea invocado por Lua, debe coincidir con una firma determinada y usar la API de Lua para recuperar parámetros y obtener resultados. Estoy escribiendo un contenedor C# de Lua y estoy interesado en poder llamar a métodos C# arbitrarios sin hacer que sigan estas convenciones. Cuando envuelve algo como D, uno puede usar el sistema de plantillas para crear dinámicamente este código de pegamento para cualquier método dado. Estaba pensando que esto también podría ser posible en C#, pero usando generación de código dinámico.¿Cómo usar la generación de código para crear dinámicamente métodos C#?
La API C se ve más o menos así, y el código generado podría manipular esto a través de una parte de nivel inferior de mi biblioteca que P/invoca la biblioteca 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 */
}
Así que, básicamente, la idea es tomar un método de C#, reflejar sus parámetros y valores de retorno, generar (o recuperar de la memoria caché) un método que utiliza la API de Lua como la de arriba a pasar esos parámetros y devolver los tipos de retorno y finalmente empujar ese método a Lua. Entonces, cuando se llama a la función C# desde Lua, se parece a lua -> función de envoltura mágica -> función C# normal.
Gracias.
Este es un enfoque interesante, nunca pensé en escribir C# real y luego compilar eso. Probablemente lo que terminaré haciendo. Gracias. – jsimmons
¿Cómo se generan las clases en el disco en primer lugar? – jcolebrand
@jcolebrand - No estoy seguro de lo que estás preguntando, pero creo que deberías publicar una nueva pregunta. – Cheeso