Http服务器-第十步加入基于Mono平台的C#脚本支持

梦想游戏人
目录:
C/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#一样可以有。

Scroll Up