类共享访问机制
Moonsharp为C#版本的lua运行库,通过该库可实现lua在C#上的个性化,共享类实现如下:
class MyClass {
public int value;
public MyClass(int i) {
value = i;
}
public int add(int num)
{
return value + num;
}
public bool valid() { return false;}
}
UserData.RegisterType<MyClass>();
Script script = new Script();
MyClass o = new MyClass(10);
DynValue obj = UserData.Create(o);
script.Globals.Set("alarm", obj);
DynValue ret = script.DoFile("network.lua");
而Lua脚本程序如下:
sum = alarm.value
for i = 1,100 do
sum = sum + i
end
return alarm.valid()
静态方法共享机制
script.Globals["writeln"] =(Action<string>)MyClass.Writeln;
writeln(string.format("结果sum:%s",sum))
模块加载机制
当C#需要调用Lua中回调函数时,我们可以现将Lua脚本加载后在必要的地方调用脚本中的函数。
//加载脚本
DynValue now = UserData.Create(DateTime.Now);
this.script.Globals.Set("Now", now);
DynValue ret = this.script.DoFile("alarm.lua");
//调用脚本
DynValue ret = this.script.Call(this.script.Globals[“RealAlarm”],ad);
//Lua脚本函数定义如下:
function RealAlarm(alarm)
local dd = Parse(alarm.LastOccurrence)
local i
i,_ = string.find(alarm.summary, "错误")
if i ~= nil then
return false
end
--- 告警时间超过5分钟,告警次数小于5,且不包含在缓存中
if alarm.num< 5 and Now.CompareTo(dd.AddSeconds(5*60)) > 0 and not cache.Contains(alarm) then
print(string.format("告警内容:%s",alarm.summary))
if(IsNullOrEmpty(alarm.KpiDescription)) then
Speak(string.format("实时告警1:%s",alarm.summary))
else
Speak(string.format("时告警2:%s",alarm.summary))
end
cache.InsertItem(alarm)
end
end