【发布时间】:2011-01-22 05:06:42
【问题描述】:
为了在 C 中定义一个可由 Lua 调用的方法,它必须匹配给定的签名并使用 Lua API 来检索参数并返回结果。我正在编写 Lua 的 C# 包装器,并且我对能够调用任意 C# 方法而不使它们遵循这些约定感兴趣。当包装在 D 之类的东西中时,可以使用模板系统为任何给定的方法动态创建此胶合代码。我在想这在 C# 中也是可能的,但是通过使用动态代码生成。
C API 看起来像这样,生成的代码将通过我的库的较低级别部分来操作它,该部分 P/Invokes 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 */
}
所以基本上这个想法是采用一个 C# 方法,反映它的参数和返回值,生成(或从缓存中检索)一个使用 Lua API 的方法,就像上面一样,传递这些参数并返回这些返回类型,最后推送它Lua 的方法。因此,当从 Lua 调用 C# 函数时,它看起来像 lua -> 魔术包装函数 -> 普通 C# 函数。
谢谢。
【问题讨论】:
标签: c# .net reflection code-generation lua