Http服务器-第十步加入基于Mono平台的C#脚本支持
该篇是Http服务器系列博文的第十篇。对应项目是LiteHttp具体可访问 http://dreamyouxi.com/litehttp.html 。
Unity引擎中C#脚本运行环境是Mono平台,而非微软的net,Unity引擎大部分是c++编写。
在LiteHttp项目中,原本支持lua脚本支持书写动态网页,这里引入C#脚本来进行辅助c++端开发。
把C#当叫脚本来使用的话,优势比lua多很多,底层还是基于C++构建。
step1:去mono官网下载 msi,x64 x86对于是64和32位exe。
step2:编写C#和c++测试代码
c++:
c#:
cpp运行结果:
在LiteHttpSvr的初步应用:文件系统。把原本C++端的文件读和缓存迁徙到C#实现。
C++端的修改
C#端
using System; using System.Collections.Generic; using System.IO; namespace LiteHttpScript { class CppEntry { static string CallMain(string file) { try { //System.Console.WriteLine("[C# Handle]:" + file); return FileCache.Handle(file); } catch (Exception e) { System.Console.WriteLine("Err:" + e.Message); return ""; } } } public class FileCache { static FileCacheImpl impl = new FileCacheImpl(); public static string Handle(string file) { lock (impl) { return impl.GetFile(file); } } }; //sample LRU file cache which limited by memory public class FileCacheImpl { class FileData { public string key; public string data; public DateTime lastModifyUTCTime; } public string GetFile(string file) { LinkedListNode<FileData> ret = null; if (_cache.TryGetValue(file, out ret)) { //has find cache _list.Remove(ret); _list.AddFirst(ret); //check file will update or not } else { //missing cache try { var data = new FileData(); var info = new FileInfo(file); data.lastModifyUTCTime = info.LastWriteTimeUtc; data.data = File.ReadAllText(file); data.key = file; ret = new LinkedListNode<FileData>(data); _list.AddFirst(ret); _cache.Add(file, ret); _currentMemoryUseage += data.data.Length; } catch (Exception e) { //file not exist return ""; } } while (_list.Count > 1 && _currentMemoryUseage >= MaxMenmoryCacheSize) { var tail = _list.Last; _cache.Remove(tail.Value.Value.key); _list.RemoveLast(); _currentMemoryUseage -= tail.Value.Value.data.Length; } //GC.Collect(); return ret.Value.data; } // private long MaxMenmoryCacheSize { get { return 104857600L; } }//最大缓存大小 100 MB private long MaxMenmoryCacheSize { get { return 100L; } }//最大缓存大小 100 MB // private long MaxCacheFileNum { get { return 1024; } }//最大文件缓存数量 private long _currentMemoryUseage = 0; private Dictionary<string, LinkedListNode<FileData>> _cache = new Dictionary<string, LinkedListNode<FileData>>(); private LinkedList<LinkedListNode<FileData>> _list = new LinkedList<LinkedListNode<FileData>>(); }; }
输出结果:
关于脚本语言的一些其他可以有的特性比如 热更新,C#一样可以有。