C# 内嵌脚本的研究(二)在C#与Lua相互调用

引言:

勇哥想研究一下C#内嵌脚本的知识。
主要想把运动控制、视觉的一些功能封装成指令,用脚本语言进行调用。
就像机器人的vb语言,它就是把一些功能封装成指令进行调用。


image.png


例如lua可以扩展nginx的功能,直接访问MySql数据库,达到1000k的访问量级别。

image.png

另外,Lua也是可以扩展游戏的功能,即做游戏外挂。




一、利用LuaInterface调用lua代码


1、下载luainterface,这里用的luainterface-1.5.3版本。

2、添加 LuaInterface.dll的引用。

3、利用解释器进行调用

using LuaInterface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();//创建LUA解释器  
            lua["num"] = 34;
            Console.WriteLine(lua["num"]);
            Console.ReadLine();
        }
    }
}


运行结果是控制台输出34

image.png


注意bin目录下必须有lua的三个dll

image.png



二、lua.Dostring执行


        //lua.Dostring执行
        static void Main(string[] args)
        {
            Lua lua = new Lua();//创建LUA解释器  
            lua.DoString("str = 'a lua string'");
            lua.DoString("num = 2");
            object[] values = lua.DoString("return num,str");
            foreach (object obj in values)
                Console.WriteLine(obj);
            Console.ReadLine();
        }


结果:

image.png



三、lua.DoFile执行


c#代码

 static void Main(string[] args)
        {
            Lua lua = new Lua();//创建LUA解释器  
            lua.DoFile("luaCode.lua");
            Console.ReadLine();
        }


执行结果:

image.png



lua代码,PS:要使用ANSI编码保存


image.png

num = 2;  
str = "lua string"  
print(num,str)



四、将C#普通方法注册到Lua


 //将C#普通方法注册到Lua
        static void Main(string[] args)
        {
            Lua lua = new Lua();//创建LUA解释器  
            Program p = new Program();
            lua.RegisterFunction("CLRMethod", p, p.GetType().GetMethod("CLRMethod"));
            lua.DoString("CLRMethod()");
            Console.ReadLine();
        }

        public void CLRMethod()
        {
            Console.WriteLine("CLRMethod is Run");
        }

结果:

image.png



五、将C#静态方法注册到Lua


 //将C#静态方法注册到Lua
        static void Main(string[] args)
        {
            Lua lua = new Lua();//创建LUA解释器  
            lua.RegisterFunction("CLRMethod", null, typeof(Program).GetMethod("CLRMethod"));
            lua.DoString("CLRMethod()");
            Console.ReadLine();
        }

        public static void CLRMethod()
        {
            Console.WriteLine("Static CLRMethod is Run");
        }


结果:

image.png


六、Lua调用C#方法

1、将luanet.dll 放入Debug目录下


[plain]  view plain  copy

require "luanet"  

  

luanet.load_assembly("System");  

  

Int32 = luanet.import_type("System.Int32");  

  

num = Int32.Parse("3425")  

  

print(num)   

  

print(Int32)   


2、实例II,将程序集名称与命名空间改成testluainterface


[csharp]  view plain  copy

using LuaInterface;  

namespace testluainterface  

{  

    class Program  

    {  

        static void Main(string[] args)  

        {  

            Lua lua = new Lua();//创建LUA解释器  

            lua.DoFile("mylua.lua");  

            Console.ReadLine();  

        }  

        public string name = "name of program";  

        public void TestMethod()  

        {  

            Console.WriteLine("TestMethod is Run");  

        }  

    }  

}  


[plain]  view plain  copy

require "luanet"  

  

luanet.load_assembly("testluainterface")  

  

Program = luanet.import_type("testluainterface.Program")  

  

program1 = Program()  

  

print(program1.name)  

  

program1:TestMethod()  



七、Lua调用C#特殊方法(out ref)

1、当函数中有out或ref参数时,out参数和ref参数和函数的返回值一起返回,并且调用的时候,out参数不需要传入


out和ref会作为返回值和c#方法组成一个table一起返回,先返回方法返回值,再返回out或ref


[csharp]  view plain  copy

using System;  

using LuaInterface;  

namespace testluainterface  

{  

    class Program  

    {  

        static void Main(string[] args)  

        {  

            Lua lua = new Lua();//创建LUA解释器  

            lua.DoFile("mylua.lua");  

            Console.ReadLine();  

        }  

  

        public void TestOut(string text, out string msg)  

        {  

            Console.WriteLine(text);  

            msg = "out";  

        }  

  

        public void TestRef(string text, ref string msg)  

        {  

            Console.WriteLine(text);  

            msg = "ref";  

        }  

    }  

}  


[plain]  view plain  copy

require "luanet"  

  

luanet.load_assembly("testluainterface")  

  

Program = luanet.import_type("testluainterface.Program")  

  

program1 = Program()  

  

print(program1:TestOut("Lua out"))  

  

print(program1:TestRef("Lua ref","C# ref"))  



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年5月    »
12345
6789101112
13141516171819
20212223242526
2728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864