1. 程式人生 > >熱更新中的lua與c#

熱更新中的lua與c#

熱更新使用lua指令碼與C#指令碼進行互相呼叫,所以首先要了解這兩種不同語言之間是如何進行呼叫的。

暫時版:http://pan.baidu.com/s/1eSzcSWM

重中之重,------->luainterface

引入luainterface.dll和luanet.dll庫,新增對這個兩個dll庫的引用,這是準備工作。

第一部分 在C#中使用lua直譯器

首先就是建立lua直譯器

            //1. 使用lua直譯器
            Lua lua = new Lua();
            lua["yes"] = 34;
            lua["no"] = "string value";
            lua.NewTable("mytable");
            Console.WriteLine(lua["yes"]);
            Console.WriteLine(lua["no"]);
輸出:


呼叫lua直譯器中的內建函式

            /*
               script.lua content
               print("hahaha")             
            */
            lua.DoString("num=2");//使用DoString建立變數
            lua.DoString("str='a string'");

            object[] retVals = lua.DoString("return num,str");//使用DoString返回變數值
            foreach (object item in retVals)
            {
                Console.WriteLine(item); //print : 2 a string
            }
輸出:


如何註冊C#的函式到lua解析器中

            // 1.把一個類中的普通方法註冊進去
            lua.RegisterFunction("NormalMethod", obj, obj.GetType().GetMethod("NormalMethod"))
lua.DoString(" NormalMethod()");

            //2.把一個類的靜態方法註冊進去
            lua.RegisterFunction("StaticMethod", null, typeof(ClassName).GetMethod("StaticMethod"))
lua.DoString(" StaticMethod()")
測試
            //非靜態方法註冊
            Program p = new Program();
            Lua lua = new Lua();
            lua.RegisterFunction("TestMethod", p, p.GetType().GetMethod("TestFunction"));
            lua.DoString("TestMethod(1,2)");//傳入引數即可

            //靜態方法註冊
            //Lua lua = new Lua();

            lua.DoFile("test.lua");
            lua.RegisterFunction("StaticMethodTest", null, typeof(Program).GetMethod("TestFunctionTo"));//注意函式公有
            lua.DoString("StaticMethodTest()");

        }

        //非靜態方法的註冊
        public void TestFunction(int a, int b)
        {
            Console.WriteLine(a + b);
        }

        //靜態方法的註冊
       public static void TestFunctionTo()
        {
            Console.WriteLine("this is static method...");
        }

第二部分 如何在lua中呼叫C#

這裡需要理解的就是,我們在lua中呼叫C#,然後lua指令碼執行也可以放在C#中使用解析器執行

lua指令碼

/*
						call
			      ------------>
			lua                         C#
				  <------------
						excute
*/

require "luanet" --call bridge
luanet.load_assembly("luainterface learn") --use bridge call assembly.dll 
GameSceneCallBack=luanet.import_type("luainterface_learn.GameScene")--call calss.
calssInit=GameSceneCallBack()

calssInit:Test()--call method.
sceneName,outValue=calssInit:Test("scene_ui/uiTask") 
print(sceneName,  outValue)
print(calssInit.GameSceneName)--call filed
print(calssInit.LoadPath)
源類:
/// luainterface.dll 
namespace luainterface_learn//***luainterface_learn
{
     class GameScene
    {
        private string GameSceneName = "LoginScene";
        public string LoadPath = "ui/Scene_uiChat";

         private void Test()
         {
             Console.WriteLine("this  is  lua test method ....");
         }

         string Test(string scenePath, out string SceneName)
         {
             SceneName = null;
             Console.WriteLine("do! call scene:"+scenePath);
             SceneName = "RoleSelect";

             return "this is test data";
         }
    }
}

解析器呼叫

            Lua lua=new Lua();
            lua.DoFile("ScriptTest.lua");

輸出:

相關推薦

更新luac#

熱更新使用lua指令碼與C#指令碼進行互相呼叫,所以首先要了解這兩種不同語言之間是如何進行呼叫的。 暫時版:http://pan.baidu.com/s/1eSzcSWM 重中之重,-------&g

Lua C/C++ 交互系列:註冊枚舉enum到Lua Code

mon size main 空間 log 方便 我們 .cpp lua 在Lua Code中註冊C/C++的枚舉很easy,就像註冊全局變量一樣。我們使用枚舉名稱作為命名空間,來避免註冊的枚舉發生沖突。註冊的枚舉存儲在全局環境(線程環境)中。 當在Lua Code中

luaC交互關鍵函數

const lua_next 素數 font con tab 成功 create 參數 1、lua_next(L, t_idx) 參數解釋: L:虛擬機 t_idx:table在棧中索引 返回 int:0執行失敗;非0執行成功

LuaC的基礎互動

// // testLua.cpp // testLuaCall // // Created by ljw on 2018/9/26. // Copyright © 2018年 x. All rights reserved. // #pragma once #include "lua/l

013-更新lua語言六

學習到現在我們對lua也是具有很深的瞭解,知道lua是熱更新的重要語言,所以我們要繼續學習lua。今天我們學習的是lua檔案 Lua檔案 I/O 其實這個都是我們是很熟悉的,它的內容也沒有多少。記得我們在考江蘇二級的時候,最後一題總是會考這個,其中最有名的是printf與fprintf了。只要知道一個是往

CodePush更新切換本地微軟服務

之前測試code-push-server時候將服務端地址寫成本地了 操作程式碼: code-push login http://192.168.1.100:3000        此後很長一段時間沒有使用,並且本地服務程式碼、資料庫

Android JNIJavaC++物件如何建立一一對應的關係

Android JNI中Java與C++物件如何建立一一對應的關係 環境 系統:Mac OSX IDE:android studio 3.0 1.JAVA物件持有C++物件的指標 在java類中建立long型別的變數如(long mNativeStudent )

LuaC++互動--lua c api用法--02

1 引入lua 中標頭檔案 extern “C” { #include <lua.h> #include <lualib.h> #include <lauxlib.h> } 2 lua中常用的API 1 lua 與 C++互

Cocos2dx-- LuaC++繫結

C++與Lua互動原理 首先,不同語言互動,我們一般把這種程式設計方式稱為混合程式設計。開發中為什麼要多語言混合使用,只用c++不行嗎?答案是因為指令碼語言語法糖多使用方便、沙盒式安全機制使系統更穩定、簡單易學降低開發成本等,那麼,只用指令碼不行嗎?那也是不合

Android App更新的外掛化(ClassLoader、DexLoader)(1)

PathClassLoader在熱更新的作用? Android ClassLoader流程解讀並簡單方式實現熱更新- https://www.jianshu.com/p/2f4939320eb1 > Android 動態升級  1.Android 外掛化 —— 指將

Unity3DjsC#之間相互呼叫的解決辦法

轉載自:http://www.manew.com/3102.html Unity3D中一些指令碼的方法只能用在JS中,在C#中是無效的,而C#可以與伺服器端通訊,JS本身卻不行。而且,如果需要用到js呼叫c#的問題,js會比c#先編譯,所以在mac裡編譯ios的時候會出錯,

Python格式化使用%C prinf格式輸出的區別

一.格式 1.1 C printf()的一般格式    printf(格式控制,輸出列表);    例:int i = 3;        double f = 4.56;        printf("%d,%f", i,f); 1.2  PYTHON 格式化輸出    格式標記字串 % 要輸出的值組  

lua c/c++ 互動(6) lua呼叫C++(使用陣列 和字串函式)

lua呼叫 c++ 的 兩個函式: 一個是 對lua 陣列 呼叫函式替換 陣列元素,一個 分割字串 test.lua --陣列操作 a = {1,2,3,4,5,6} swapArray(a,function(t) return t + 1 end) local

LuaC#的區別

Lua中沒有 ++ 、 +=運算; Lua中可以通過 "^" 求冪   --> 10^3 == 1000  ;100^(0.5) == 10 取餘的演算法(floor方法,取比指定數小的最大的整數)    --> floor(5/3) == 1     求5/

luaC/C++互調函式方法

lua與C/C++互調函式方法 1.在lua指令碼中呼叫C/C++程式碼中的函式 C/C++函式定義形式        lua中呼叫的C++函式的定義必須滿足如下形式: typedef int(*lua_cFunction)(lua_State *L);  

Lua C/C++ 互動系列:通過C呼叫Lua函式(1)

1、Lua通過ANSI C 進行編寫,Lua與C互動要遵循一定的協議規則。在Lua 5.1 Reference Manual中明確規定如何通過C Code呼叫Lua 編寫的函式。      C  code可以呼叫Lua Code編寫的任何函式.本文主要以全域性函式來做演示

Lua:模組、使用位操作BitOp、C API(LuaC互相呼叫)

一、模組 1.1 概述 建立一個模組最簡單的方法是:         1. 建立一個table;         2. 並將所有需要匯出的函式放入其中;         3. 最後返回這個table。 1.2 程式碼 檔案:test.lua complex = {} f

C#呼叫C++dll,C++char*C#型別的對應關係

最近在編寫C#上位機應用程式,需要呼叫C++的dll,期間遇到dll介面庫中char*型別糾結了很久,試過string,StringBuilder,StringBuilder結果都以失敗告終,通過查詢部落格等資料最後找到了救命稻草---IntPtr。例子如下: C++dll

Tolua使用筆記二:luaC#的函式,變數互動方法

接著上一回的接著講: 案例三: 到這裡久終於到了大家最感興趣的地方了,熱更新的價值就在於用指令碼語言寫邏輯,這樣可以實現邏輯的頻繁改動而不用每次更新都重新下載。 而這個過程中必然涉及到C#對lua的一個邏輯呼叫,而這個例子實現的就是C#的函式的呼叫 核心程式碼如下:

C++getlineCscanf、gets小結

 getline()的原型是istream& getline ( istream &is , string &str , char delim ); 其中 istream