C#の(A)の有する[ルア]相互作用が

参考リンク:

https://www.cnblogs.com/chinarbolg/p/9601452.html

 

luainterfaceダウンロード(1.5.3推奨):

http://files.luaforge.net/releases/luainterface/luainterface

 

0.5製造

アンパック良いluainterfaceをダウンロードし、内蔵フォルダを開き、後でDLLを使用することになるそのうちの3つ

C#のコンソールは、参照を追加し、プロジェクトを作成しますLuaInterface.dll上に選択します。そして、ビン内の次の項目に上記lua51.dllとluanet.dllをコピー\ Debugディレクトリ

 

Luaのインタプリタを作成します。1.

1  使用LuaInterface;
 2  使用システム;
 3  
。4  名前空間はTestLua
 5。 {
 6つの。     クラスプログラム
 7。     {
 8。         静的 無効メイン(文字列[]引数)
 9。         {
 10              LuaのLUA = 新しい新規のLUA();         // Luaのインタプリタを作成する
。11              LUA [ " NUM " ] = 66 ;                // LUA環境でのC#のスクリプトで、変数の作成
12              LUAを[ "STR " ] = " Chinarは" ;          // C#スクリプトLUA環境と、文字列変数を作成し
13である              (Console.WriteLineをLUA [ " NUM " ;])// 出力
14              Console.WriteLineを(LUA [ " STR  ] ); // 出力
15              Console.ReadKey();              // 入力を待つ
16          }
 17      }
 18 }

出力:

 

2. LUAコードセグメント(lua.DoString)を実行

 1 using LuaInterface;
 2 using System;
 3 
 4 namespace TestLua
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             Lua lua = new Lua();                              //创建一个lua解释器
11             lua.DoString("num=666");                          //用C#脚本在lua环境中,创建一段lua脚本:num=666
12             lua.DoString("str='chianr666'");                  //用C#脚本在lua环境中,创建一段lua脚本:str='chianr666'
13             object[] values = lua.DoString("return num,str"); //用一个object数组 去接受返回值
14             foreach (var value in values)                     //遍历 values 数组中的元素
15             {
16                 Console.WriteLine(value); //输出
17             }
18             Console.ReadKey(); //等待输入
19         }
20     }
21 }

输出:

 

3.执行lua代码文件(lua.DoFile)

 1 using LuaInterface;
 2 using System;
 3 
 4 namespace TestLua
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             Lua lua = new Lua();      //创建一个lua解释器
11             lua.DoFile("test.lua");    //加载lua文件 —— lua.DoFile(文件名)
12             Console.ReadKey();        //等待输入
13         }
14     }
15 }

test.lua

1 print('I am Chianr')
2 MyTable={1,22,333,4444,55555,666666}
3 print(table.concat(MyTable)..'I am Chianr')

注意要将上面的lua文件拖到项目根目录中,并且修改属性如下,这样lua文件才能被识别到

输出:

 

4.将c#的方法注册到lua中,供lua调用(lua.RegisterFunction)

 1 using LuaInterface;
 2 using System;
 3 
 4 namespace TestLua
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             Lua lua = new Lua();     //创建一个lua解释器
11             Program program = new Program(); //声明一个对象
12 
13             //lua.RegisterFunction 注册方法(注册到Lua中以后方法的名称,程序对象,程序的类型program.GetType().(传入C#中的方法名:需要是公有方法))
14             lua.RegisterFunction("LuaChinarTest", program, program.GetType().GetMethod("ChinarTest"));
15             //然后用lua.DoString(Lua中方法名())调用测试
16             lua.DoString("LuaChinarTest()");
17 
18             //lua.RegisterFunction 注册静态方法(注册到Lua中以后方法的名称,空,程序的类型 typeof(Program).(传入C#中的方法名:需要是公有方法))
19             lua.RegisterFunction("LuaChinarStaticTest", null, typeof(Program).GetMethod("ChinarStaticTest"));
20             //然后用lua.DoString(Lua中静态方法名())调用测试
21             lua.DoString("LuaChinarStaticTest()");
22 
23             Console.ReadKey(); //等待输入
24         }
25 
26         /// <summary>
27         /// 一个测试方法
28         /// </summary>
29         public void ChinarTest()
30         {
31             Console.WriteLine("这是一个空方法");
32         }
33 
34         /// <summary>
35         /// 一个静态测试方法
36         /// </summary>
37         public static void ChinarStaticTest()
38         {
39             Console.WriteLine("这个一个静态空方法");
40         }
41     }
42 }

输出:

 

5.lua调用c#中的类

 1 using LuaInterface;
 2 using System;
 3 
 4 namespace TestLua
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             Lua lua = new Lua();           //创建一个lua解释器
11             lua.DoFile("test2.lua"); //Lua引用C#中的类
12             Console.ReadKey();             //等待输入
13         }
14 
15         public int ChinarNum = 60;       //整形变量
16         public string Name = "Chinar"; //字符串变量
17 
18         /// <summary>
19         /// 用来让Lua脚本测试的方法
20         /// </summary>
21         public void ChinarTestFun()
22         {
23             Console.WriteLine("你好,Chinar");
24         }
25 
26         /// <summary>
27         /// Ref方法,参数
28         /// </summary>
29         /// <param name="name"></param>
30         /// <param name="count"></param>
31         public void TestRef(string name, ref int count)
32         {
33             Console.WriteLine(name);
34             Console.WriteLine(count);
35             count = name.Length;
36         }
37 
38 
39         /// <summary>
40         /// Out方法,参数
41         /// </summary>
42         /// <param name="name"></param>
43         /// <param name="count"></param>
44         public void TestOut(string name, out int count)
45         {
46             Console.WriteLine(name);
47             count = name.Length;
48         }
49     }
50 }

test2.lua

 1 -- 如果DeBug中有luanet.dll文件,则不需要再次引用
 2 -- require "luanet"
 3 -- 加载CLR类型("命名空间")
 4 luanet.load_assembly("System")
 5 -- 加载命名空间下的类
 6 Int32 = luanet.import_type("System.Int32")
 7 -- 输出
 8 print(Int32)
 9 print('- - - - - - - - - - - - - - - - - - - - - - - - - - ')
10 
11 
12 -- 加载CLR类型("命名空间"ChinarTest)
13 luanet.load_assembly("TestLua")
14 -- 加载命名空间下的类Program
15 Pro=luanet.import_type("TestLua.Program")
16 
17 -- 实例化一个类对象
18 pro=Pro()
19 -- 输出
20 print(pro.ChinarNum)
21 
22 -- 调用C#中的方法
23 pro:ChinarTestFun()
24 
25 -- 调用Out方法,out参数不需要传入值,会直接返回类型为一个:表
26 -- 由于C#那边是一个空返回值的方法,所以第一个返回为空
27 -- 第二个返回 out参数
28 void,stringCount=pro:TestOut("chinar.fun")
29 print(void,stringCount)
30 
31 -- Ref参数
32 void1,stringCount1=pro:TestRef("chinar.fun",8)
33 print(void1,stringCount1)

输出:

おすすめ

転載: www.cnblogs.com/lyh916/p/12234143.html