1 using Net.Sz.Framework.Log; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace TestApp 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 //Logger.LOGCONSOLE = true;//不在控制台打印信息 15 //Logger.LOGLEVEL = Logger.ENUM_LOGLEVEL.INFO;//不显示debug消息 16 Logger.Info("==================Start============================"); 17 18 Net.Sz.Framework.Script.ScriptManager.GetInstance().LoadCSharpFile(new string[] { "../../../TestApp.Scripts/" }); 19 20 MainManager.GetInstance().Test(); 21 22 Logger.Info("==================End============================"); 23 Console.ReadLine(); 24 } 25 } 26 } |
我们先尝试运行一次
也许上面的打印太乱,我们看看简洁版本的
上面我们看样看出来,功能是没有问题的。
如果你稍微注意了,或者看过我之前的文章的话,会发现我的这个脚本没有实现IBaseScript接口,而只继承了BaseScript抽象类。
因为这样的脚本不需要放到脚本存储器里面,只需要执行init函数,把脚本自身反注册到主程序函数体里面!
现在就是牵涉更新的事情。
更新有一个问题,当服务一旦部署后需要更新那就是的再次执行加载脚本方法。如果你使用windows服务运行的,更新势必是一个问题。
这里我只介绍一种方式,http监听方式。
要开启http监听方式,需要一个Net.Sz.Framework.Netty.Http.IHttpHandler的实现类
1 using Net.Sz.Framework.Log; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 9 /** 10 * 11 * @author 失足程序员 12 * @Blog http://www.cnblogs.com/ty408/ 13 * @mail 492794628@qq.com 14 * @phone 13882122019 15 * 16 */ 17 namespace TestApp 18 { 19 /// <summary> 20 /// 21 /// </summary> 22 public class ReloadScriptHandler : Net.Sz.Framework.Netty.Http.IHttpHandler 23 { 24 public void Action(Net.Sz.Framework.Netty.Http.HttpSession session, string method, string bindpath, Dictionary<string, string> parms) 25 { 26 Logger.Info("收到请求"); 27 28 Net.Sz.Framework.Script.ScriptManager.GetInstance().LoadCSharpFile(new string[] { "../../../TestApp.Scripts/" }); 29 MainManager.GetInstance().Test(); 30 31 session.writeSuccess(); 32 session.AddBodyLine("OK"); 33 session.WriteFlush(); 34 } 35 } 36 } |
接下来我们在主函数加入下面代码
Dictionary<string, Net.Sz.Framework.Netty.Http.IHttpHandler> handlers = new Dictionary<string, IHttpHandler>();
handlers.Add("ReloadScript", new ReloadScriptHandler());//开启对http监听,监听模块为 ReloadScript
Net.Sz.Framework.Netty.NettyPool.GetInstance().AddHttpBind("127.0.0.1", 9527, handlers);
运行起来,看看,
可以看出,开启了http监听,reloadscript
然后我们修改一下MainManagerScript文件的Test方法
public void Test()
{
Logger.Info("我是test 修改过的版本");
}
在浏览器输入:http://127.0.0.1:9527/reloadscript
运行时成功的。这样的架构方式,很适合的是游戏开发,某些功能块很容易出bug,如果用脚本存储器访问比较耗费性能。
这样反向注册功能块脚本到功能块,既能实现bug的热更新,也不会影响性能消耗。