如何在C#中集成Lua脚本

作者:Hello——寻梦者! 时间:2021-12-24 23:24:35 

背景

在很多时候我们代码中的一些逻辑操作并不能够硬编码到代码中,我们可能希望通过配置来完成这个操作,所以这个时候我们就需要有一些脚本语言能够处理这些操作,在C#语言中比较常见的就是通过引入NLua这个动态库来引入lua脚本语言从而达到灵活配置的目的,这篇文章主要是通过具体的实例来说明在C#中如何通过引入NLua并调用配置的脚本。

步骤

1 引入NLua.dll

这个dll是一个很轻量级的库,100kb左右,引用这个库可以通过Nuget包管理器来引用,当前引用的版本是1.5.7.0,我们看看引用之后的添加了哪些DLL。

如何在C#中集成Lua脚本

这个里面lua54.dll有x86和x64两个类型的版本,这个在使用的时候需要注意因为我们生成设置选择的是Any CPU所以这里会有两个版本的dll,这里使用的时候需要注意。

2 具体用法

下面通过一个控制台应用程序来看看这个脚本到底该怎么使用,这里包括直接创建表达式,注册方法并使用lua调用C#函数以及直接导入C#的库然后再调用里面内部的方法这三个方面进行描述。

2.1 直接创建表达式

       我们来直接看控制台程序中的代码


class Program
{
 static void Main(string[] args)
 {
  using (var state = new Lua())
  {
   //Evaluating simple expressions:
   //Lua can return multiple values, for this reason DoString return a array of objects
   var res0 = state.DoString("return 10 + 3*(5 + 2)")[0];
   Console.WriteLine($"Output result0:{res0}");

//Passing raw values to the state:
   double val = 12.0;
   state["x"] = val; // Create a global value 'x'
   var res1 = (double)state.DoString("return 10 + x*(5 + 2)")[0];
   Console.WriteLine($"Output result1:{res1}");

//Retrieving global values:
   state.DoString("y = 10 + x*(5 + 2)");
   double y = (double)state["y"]; // Retrieve the value of y
   Console.WriteLine($"Y result:{y}");    

Console.ReadKey();
  }
 }}

如何在C#中集成Lua脚本

注意事项:

  首先来看这个注释:Lua can return multiple values, for this reason DoString return a array of objects,就是直接调用DoString方法的时候返回的结果是一个object[]类型,所以这里需要取结果的时候要取用第一个

如何在C#中集成Lua脚本

2.2 注册Lua Function

这里我们通过直接在DoString中定义好function,然后通过Call方法进行调用,我们再来看下面的示例及返回结果


class Program
{
 static void Main(string[] args)
 {
  using (var state = new Lua())
  {
   //Retrieving Lua functions:
   state.DoString(@"function ScriptFunc (val1, val2)
          if val1 > val2 then
           return val1 + 1
          else
           return val2 - 1
          end
         end
         ");
   var scriptFunc = state["ScriptFunc"] as LuaFunction;
   var funcRes = scriptFunc.Call(3, 5).First();
   Console.WriteLine($"Func result:{funcRes}");

Console.ReadKey();
  }
 }
}

同样的我们也来看看最终执行的结果

如何在C#中集成Lua脚本

2.3 Lua调用C#函数

下面的例子包含了几种不同的参数类型及返回类型用来演示调用的完整过程。


using System;
using System.Linq;
using NLua;

namespace NLuaConsoleApp
{
class Program
{
 static void Main(string[] args)
 {
  using (var state = new Lua())
  {
   ////---------------------------------------------------lua调用c#函数
   TestClass obj = new TestClass();

// 注册CLR对象方法到Lua,供Lua调用 typeof(TestClass).GetMethod("TestPrint")
   state.RegisterFunction("TestPrint", obj, obj.GetType().GetMethod("TestPrint"));

// 注册CLR对象方法到Lua,供Lua调用 typeof(TestClass).GetMethod("AnotherFunc")
   state.RegisterFunction("AnotherFunc", obj, obj.GetType().GetMethod("AnotherFunc"));

// 注册CLR静态方法到Lua,供Lua调用
   state.RegisterFunction("TestStaticPrint", null, typeof(TestClass).GetMethod("TestStaticPrint"));

state.DoString("TestPrint(10,20)");
   state.DoString("AnotherFunc('10','20')");
   state.DoString("TestStaticPrint()");

Console.ReadKey();
  }
 }

class TestClass
 {

public int TestPrint(int num,int num2)
  {
   var result = num + num2;
   Console.WriteLine("Print result:" + result);
   return result;
  }

public void AnotherFunc(string val1, string val2)
  {
   Console.WriteLine($"MyTest,Param1:{val1},Param2:{val2}");
  }

public static void TestStaticPrint()
  {
   Console.WriteLine("TestStaticPrint");
  }
 }

}
}

同样的我们来看整个测试的返回完整结果。

如何在C#中集成Lua脚本

2.4 通过Import导入命名空间引用C#函数

这个是按照官方的例子进行模拟的,但是在调用的时候总是报错,现贴出具体的示例供后面排查使用


class Program
{
 static void Main(string[] args)
 {
  using (var state = new Lua())
  {
   state.LoadCLRPackage();
   state.DoString(@" import ('System.Web') ");
   state.DoString(@" client = WebClient() ");
   state.DoString(@"local res = client:DownloadString('http://nlua.org')");

Console.ReadKey();
  }
 }
}

这个就是说通过调用C#程序集并引入命名空间,然后调用其内部的WebClient方法,这个在调试的时候一直都是报错,这个暂时记录供以后进行排查错误

如何在C#中集成Lua脚本

3 总结

这里有一些地方需要注意Lua对象是实现了IDispose接口的,所以我们在使用的时候需要注意使用using方式或者是使用后调用Dispose方法来对资源进行释放。另外C#中引入Lua脚本的常见主要是适用于部分调用过程不适合硬编码在代码里而适合放在配置中,通过配置不同的Lua脚本从而对程序进行定制化操作,是对现有代码一个很好的补充,另外对于调用C#中dll的方法出现的问题还在研究中,后面发现了再更新此过程。

来源:https://www.cnblogs.com/seekdream/p/14431273.html

标签:c#,集成,Lua,脚本
0
投稿

猜你喜欢

  • spring的jdbctemplate的crud的基类dao

    2022-05-30 13:05:17
  • 解决Weblogic部署war找不到spring配置文件的问题

    2022-12-29 07:03:08
  • Java身份证号码校验工具类详解

    2022-09-03 18:06:27
  • Redis 订阅发布_Jedis实现方法

    2023-11-10 03:38:41
  • C# XmlDocument操作XML案例详解

    2021-11-23 04:00:01
  • Java简单计时的实现案例(可以用来限时循环)

    2023-02-01 21:39:19
  • 解决Eclipse创建android项目无法正常预览布局文件问题的方法

    2023-07-31 09:51:12
  • Spring Retry 重试实例详解

    2021-07-15 22:43:26
  • 【java 多线程】守护线程与非守护线程的详解

    2023-11-29 01:35:29
  • C#中后台post请求常用的两种方式总结

    2023-04-21 17:29:40
  • SpringBoot 创建容器的实现

    2022-04-03 08:41:02
  • 学习Java九大内置对象

    2023-10-13 01:10:10
  • C#提取PPT文本和图片的实现方法

    2022-10-28 08:02:59
  • java 解析由String类型拼接的XML文件方法

    2022-07-10 12:47:14
  • android RecyclerView侧滑菜单,滑动删除,长按拖拽,下拉刷新上拉加载

    2022-01-31 12:20:46
  • Java实例讲解动态代理

    2023-03-21 22:56:45
  • C++ 多线程之互斥量(mutex)详解

    2023-12-20 18:51:32
  • Android实现EventBus登录界面与传值(粘性事件)

    2023-11-08 00:34:52
  • C#删除只读文件或文件夹(解决File.Delete无法删除文件)

    2022-06-30 15:01:59
  • Android Jni的简单使用详解

    2023-10-20 14:37:43
  • asp之家 软件编程 m.aspxhome.com