服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 如何在C#中集成Lua脚本

如何在C#中集成Lua脚本

2022-11-03 12:09Hello——寻梦者! C#

这篇文章主要介绍了如何在C#中集成Lua脚本,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

背景

  在很多时候我们代码中的一些逻辑操作并不能够硬编码到代码中,我们可能希望通过配置来完成这个操作,所以这个时候我们就需要有一些脚本语言能够处理这些操作,在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的方法出现的问题还在研究中,后面发现了再更新此过程。

以上就是如何在C#中集成Lua脚本的详细内容,更多关于C#中集成Lua脚本的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/seekdream/p/14431273.html

延伸 · 阅读

精彩推荐
  • C#C# 如何获取处于运行中的Excel、Word对象

    C# 如何获取处于运行中的Excel、Word对象

    这篇文章主要介绍了C# 获取处于运行中的Excel、Word对象操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    论眉毛你是比不过我的9842022-10-27
  • C#解析C#中的私有构造函数和静态构造函数

    解析C#中的私有构造函数和静态构造函数

    这篇文章主要介绍了C#中的私有构造函数和静态构造函数,是C#入门学习中的基础知识,需要的朋友可以参考下...

    C#教程网5532021-11-09
  • C#C#使用ODBC与OLEDB连接数据库的方法示例

    C#使用ODBC与OLEDB连接数据库的方法示例

    这篇文章主要介绍了C#使用ODBC与OLEDB连接数据库的方法,结合实例形式分析了C#基于ODBC与OLEDB实现数据库连接操作简单操作技巧,需要的朋友可以参考下...

    aparche8172022-01-05
  • C#关于C#中排序函数的总结

    关于C#中排序函数的总结

    下面小编就为大家带来一篇关于C#中排序函数的总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网11272021-11-22
  • C#C# 中 “$” 符号的作用以及用法详解

    C# 中 “$” 符号的作用以及用法详解

    这篇文章主要介绍了C# 中 “$” 符号的作用以及用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    不染-何程龙5422022-09-14
  • C#C#9.0 新特性简介

    C#9.0 新特性简介

    这篇文章主要介绍了C#9.0 新特性简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来...

    码农阿宇11172022-10-11
  • C#C# 泛型参数转换

    C# 泛型参数转换

    本文介绍了C# 泛型参数转换的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧...

    诺贝尔12272021-12-23
  • C#C#搜索TreeView子节点,保留父节点的方法

    C#搜索TreeView子节点,保留父节点的方法

    这篇文章主要介绍了C#搜索TreeView子节点,保留父节点的方法,实例分析了C#操作TreeView节点的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    C#教程网10682021-10-26