NLua和C#交互
在Lua脚本内引入C# dll:luanet.load_assembly('NLuaTestDll')
在Lua脚本内引入C# 定义的类:TestClass=luanet.import_type('NLuaTestDll.TestClass')
将C#对象导入到Lua脚本:_luaEnv["xxx"] = xxx
将C#中定义的方法导入Lua脚本:
var method = typeof(xLuaForm).GetMethod("StaticMethod");
_luaEnv.RegisterFunction("StaticMethod", null, method);
执行脚本后获取Lua内变量:_luaEnv["xxx"]
public void Print(string msg){MessageBox.Show(msg);}private Lua _luaEnv;public xLuaForm(){InitializeComponent();_luaEnv = new Lua();_luaEnv.LoadCLRPackage();//_luaEnv.RegisterLuaClassType(typeof(Person), typeof(Person));}public static void StaticMethod(string msg){MessageBox.Show(msg);}private void simpleButton1_Click(object sender, EventArgs e){//_luaEnv.DoString("require 'CSharpCallLua'");var script = $@"luanet.load_assembly('NLuaTestDll')TestClass=luanet.import_type('NLuaTestDll.TestClass')Person=luanet.import_type('NLuaTestDll.Person')import(""System.Windows.Forms"")MessageBox.Show('hello001')local newForm = Form()newForm:ShowDialog();newForm:Dispose();person = Person()person.Name = 'Winter'person.Age = 10StaticMethod(person:ToString())participant = {{""张三"", ""李四"", ""老王"", ""狗蛋"", ""铁剩""}}StaticMethod('abc')--require 'CSharpCallLua'--person = {{Name = 'Tom', Age = 10}}name = 'jerry'form.Text = 'lua test'form:Print('hello ' .. #participant)function add(a, b)return a+bend
";_luaEnv["form"] = this;var method = typeof(xLuaForm).GetMethod("StaticMethod");_luaEnv.RegisterFunction("StaticMethod", null, method);_luaEnv.DoString(script);var person = _luaEnv["person"] as Person;MessageBox.Show(person.Name);var addFun = _luaEnv.GetFunction("add");var resObj = addFun.Call(10, 20);}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace NLuaTestDll
{public class TestClass : IFoo1{public int foo(){return 101;}}public interface IFoo1{int foo();}public class Person{public string Name { get; set; }public int Age { get; set; }public string ToString(){return $"{Name} -- {Age}";}}
}