熱更新中的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");
輸出:
相關推薦
熱更新中的lua與c#
熱更新使用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中
lua與C交互關鍵函數
const lua_next 素數 font con tab 成功 create 參數 1、lua_next(L, t_idx) 參數解釋: L:虛擬機 t_idx:table在棧中索引 返回 int:0執行失敗;非0執行成功
Lua與C的基礎互動
// // 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 JNI中Java與C++物件如何建立一一對應的關係
Android JNI中Java與C++物件如何建立一一對應的關係 環境 系統:Mac OSX IDE:android studio 3.0 1.JAVA物件持有C++物件的指標 在java類中建立long型別的變數如(long mNativeStudent )
Lua與C++互動--lua c api用法--02
1 引入lua 中標頭檔案 extern “C” { #include <lua.h> #include <lualib.h> #include <lauxlib.h> } 2 lua中常用的API 1 lua 與 C++互
Cocos2dx-- Lua與C++繫結
C++與Lua互動原理 首先,不同語言互動,我們一般把這種程式設計方式稱為混合程式設計。開發中為什麼要多語言混合使用,只用c++不行嗎?答案是因為指令碼語言語法糖多使用方便、沙盒式安全機制使系統更穩定、簡單易學降低開發成本等,那麼,只用指令碼不行嗎?那也是不合
Android App熱更新中的外掛化(ClassLoader、DexLoader)(1)
PathClassLoader在熱更新的作用? Android ClassLoader流程解讀並簡單方式實現熱更新- https://www.jianshu.com/p/2f4939320eb1 > Android 動態升級 1.Android 外掛化 —— 指將
Unity3D中js與C#之間相互呼叫的解決辦法
轉載自: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
Lua與C#的區別
Lua中沒有 ++ 、 +=運算; Lua中可以通過 "^" 求冪 --> 10^3 == 1000 ;100^(0.5) == 10 取餘的演算法(floor方法,取比指定數小的最大的整數) --> floor(5/3) == 1 求5/
lua與C/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(Lua與C互相呼叫)
一、模組 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使用筆記二:lua與C#的函式,變數互動方法
接著上一回的接著講: 案例三: 到這裡久終於到了大家最感興趣的地方了,熱更新的價值就在於用指令碼語言寫邏輯,這樣可以實現邏輯的頻繁改動而不用每次更新都重新下載。 而這個過程中必然涉及到C#對lua的一個邏輯呼叫,而這個例子實現的就是C#的函式的呼叫 核心程式碼如下:
C++中getline與C中scanf、gets小結
getline()的原型是istream& getline ( istream &is , string &str , char delim ); 其中 istream