Moonsharp学习笔记

本文是关于Moonsharp在C#环境中使用的学习笔记,重点探讨了如何实现类共享访问,包括静态方法共享机制和模块加载机制。通过Moonsharp库,可以方便地在C#中调用和交互Lua脚本的回调函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类共享访问机制

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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值