zoukankan      html  css  js  c++  java
  • Lua与.net的CLR相互调用

    工程环境搭建:

    • 下载luainterface-1.5.3.zip文件,使用到的dll为Built目录下的LuaInterface.dll、lua51.dll、luanet.dll
    • LuaInterface.dll为C#的dll,需要引用到工程中
    • lua51.dll、luanet.dll为C++的dll,需要拷贝到工程的输出目录下(Debug)
    • C#调用Lua需要使用:LuaInterface.dll和lua51.dll
    • Lua调用C#的类需要使用:LuaInterface.dll和luanet.dll,luanet.dll拷贝到工程输出目录,lua脚本中就不需要使用package.cpath和require了

    很多帖子并没有讲清楚导致报错:

    “LuaInterface.LuaException”类型的未经处理的异常在 LuaInterface.dll 中发生
    其他信息: error loading module 'luanet' from file '.\luanet.dll'
    也就是云哥我这么给力
     1 namespace TestLua
     2 {
     3     public class Program
     4     {
     5 
     6         public string name = "zhaozongyun";
     7         static void Main(string[] args)
     8         {
     9             //创建lua解释器(也叫Lua虚拟机)
    10             Lua lua1 = new Lua();
    11 
    12             Console.WriteLine("--->> C#中执行Lua字符串");
    13 
    14             //C#中执行Lua字符串
    15             lua1.DoString("num = 111");
    16             lua1.DoString("str = 'zhaozongyun'");
    17             Object[] values = lua1.DoString("return num, str");
    18             foreach (Object obj in values)
    19             {
    20                 Console.WriteLine(obj);
    21             }
    22 
    23             Console.WriteLine("--->> C#注册的普通方法到Lua中,并执行Lua字符串");
    24 
    25             //C#注册的普通方法到lua中,并执行Lua字符串
    26             Program p = new Program();
    27             Lua lua2 = new Lua();
    28             lua2.RegisterFunction("LuaMethod1", p, p.GetType().GetMethod("CLRMethod"));
    29             lua2.DoString("LuaMethod1()");
    30 
    31             Console.WriteLine("--->> C#注册静态方法到Lua中,并执行Lua字符串");
    32 
    33             //C#注册静态方法到Lua中,并执行Lua字符串
    34             lua2.RegisterFunction("LuaMethod2", null, typeof(Program).GetMethod("StaticMethod"));
    35             lua2.DoString("LuaMethod2()");
    36 
    37             Console.WriteLine("--->> C#中执行Lua脚本");
    38 
    39             //C#中执行lua脚本文件
    40             Lua lua3 = new Lua();
    41             lua3.DoFile("myLua1.lua");
    42 
    43             Console.WriteLine("--->>C#执行Lua脚本,Lua脚本中加载C#类,并访问C#");
    44 
    45             //C#执行Lua文件,Lua文件加载C#类,并调用C#
    46             Lua lua4 = new Lua();
    47             lua4.DoFile("myLua2.lua");
    48             lua4.DoFile("myLua3.lua");
    49 
    50             Console.ReadKey();
    51         }
    52 
    53         public void CLRMethod()
    54         {
    55             Console.WriteLine("CLRMethod");
    56         }
    57 
    58         public static void StaticMethod()
    59         {
    60             Console.WriteLine("StaticMethod");
    61         }
    62     }
    63 }

    Lua1脚本

    1 num = 222
    2 string = "hello world"
    3 print(string)

    Lua2脚本

    1 --加载CLR的类型、实例化CLR对象
    2 luanet.load_assembly("System")
    3 Int32 = luanet.import_type("System.Int32")
    4 print(Int32)

    Lua3脚本

    1 --require "luanet"
    2 --加载CLR的类型
    3 luanet.load_assembly("TestLua")
    4 Program = luanet.import_type("TestLua.Program")
    5 --实例化CLR对象
    6 program = Program()
    7 print(program.name)
    8 program:CLRMethod()
  • 相关阅读:
    codeforces round #433 div2
    bzoj1951
    bzoj3620
    bzoj2286
    bzoj1513
    bzoj4390
    codeforces round 430 div 2
    bzoj3339
    准备实现体积蒙皮
    看牛顿法的改进与验证局部收敛
  • 原文地址:https://www.cnblogs.com/fuyunzzy/p/6424381.html
Copyright © 2011-2022 走看看