luainterface.dll的功能是c#访问lua,里面封装了一些类
luanet.dll的功能是负责lua访问c#的解析
开始交互
创建解析器
Lua lua = new Lua();
创建一个number类型的变量
lua["num"] = 2;
//string
lua["str"] = "lua";
lua.NewTable 创建表
DoString 原理与Lua中的loadstring相似
lua.DoString("print(num,str)"); // 2 lua
在C#脚本中定义变量,接收lua脚本的返回值
object[] objs = lua.DoString("return num,str"); //获取这两个值
double i = (double)objs[0]; //因为number类型就是c#中的double类型
Console.WriteLine(i); // 2
Test类用来测试 Lua调用C#中的方法,属性
class Test
{
private string languageName = "study lua call C#";
public string LanguageName
{
get
{
return languageName;
}
}
public Test()
{
Console.WriteLine("调用了Test的无参数构造方法");
}
public Test(string value)
{
Console.WriteLine("调用了Test的有参数构造方法,参数类型为string,参数值为" + value);
}
public Test(int value)
{
Console.WriteLine("调用了Test的有参数构造方法,参数类型为int,参数值为" + value);
}
// 方法
// 静态方法和对象方法
public static void TestStaticPrint(int Value)
{
Console.WriteLine("Test类中静态方法被调用,参数为:" + Value);
}
public void TestPrint(int Value)
{
Console.WriteLine("Test类中的对象方法被调用,参数为:" + Value);
}
//包含ref关键字
public void RefMethod(ref int a)
{
Console.WriteLine("带有ref参数的动态方法被调用" + a);
}
public void OutMethod(out int a, out int b, int c)
{
Console.WriteLine("调用了OutMethod(out int a, out int b, int c)");
a = c + 10;
b = c + 10;
}
//包含out关键字
public void OutMethod(out int a, string s)
{
a = s.Length;
Console.WriteLine("out参数的方法被调用");
}
//测试
public int TT()
{
return 1000;
}
}
在 Program类中
1.将方法注册进CLR,供Lua调用
//1.1注册动态方法
Test t = new Test();
lua.RegisterFunction("CallTest", t, t.GetType().GetMethod("TestPrint"));
//1.2注册静态方法
lua.RegisterFunction("CallTestStatic", null, typeof(Test).GetMethod("TestStaticPrint"));
//1.3 调用
//lua.DoString("CallTest(10)");
//1.4 调用静态方法
//lua.DoString("CallTestStatic(10)");
lua.DoFile("HelloWorld.lua");
-- load_assembly函数的作用:加载CLR程序集
-- import_type函数作用:加载程序集中的类型
-- get_constructor_bysig 函数:显示获取某个特定的构造函数
-- LuaInterfaceDemo 到测试的命名空间
--1.导入luanet程序集,该程序集负责 lua call c#
require "luanet"=
--2.加载程序集(命名空间)
luanet.load_assembly("LuaInterfaceDemo")
--3.获取类别(获取类名)
Test = luanet.import_type("LuaInterfaceDemo.Test")
--4.调用构造函数初始化C#脚本的类对象
--t = Test() --调用无参数的构造函数
--t = Test(10) --调用有参构造方法 -- int
--t = Test("10") --调用有参构造方法 -- string
--lua调用C#构造函数规则 -- 自动匹配最近的那个
--对于某些情况并不适用,比如说C#函数中有两个一个参数的构造函数重载时即会发生匹配错误的情况
--这种情况我们需要手动指定调用哪个构造函数
test_argString = luanet.get_constructor_bysig(Test,"System.String")
t = test_argString("1")
--5.调用C#属性
--print(t.LanguageName)
--调用Test类中的TestPrint方法
t:TestPrint(10)
--调用Test类中的TestStaticPrint方法(静态)
Test.TestStaticPrint(11)
--调用带有ref参数的方法
t:RefMethod(10)
--调用带有Out参数的方法,out的参数可以不写
-- void,var = t:OutMethod("hello")
-- print(void,var)
--测试有返回值的方法
-- print(t:TT()) -- 1000
--调用带有out参数的方法2
v1,v2,v3 = t:OutMethod(10)
print(v1,v2,v3)
--1.调用的函数有返回值,该多少就是多少
--2.调用的函数没有返回值,lua默认有返回值,值是nil
--3.调用的函数中带有out关键字,lua默认处理为该函数有返回值,返回值为out修饰的参数
--4.如果函数存在返回值并且同时存在out参数列表,此时函数返回值无效,第一个参数返回的是最后一个out类型的参数,剩下顺序排列