解决方案 »

  1.   

    lua不是设计用来作为宿主的,一般都是c#作为宿主,lua作为脚本扩展功能。这样能热更新的部分是lua脚本提供的功能。最简单的办法就是每次需要的时候都从磁盘加载脚本并运行,这样替换掉脚本文件下次就使用新的了。不过这样每次加载有性能问题,如果系统负载不高那还可以(而且需要依赖于文件系统替换/保存文件的原子性)。
    复杂一点是需要监视脚本文件的变化,系统启动时就加载所有脚本,需要的时候运行。当脚本文件变化时,创建新的lua环境加载所有脚本,新的请求都使用新的环境处理,旧环境处理完之后释放掉。
    要注意脚本应该设计成无状态的,这样切换就很容易。如果有状态,切换的时候复制状态可能会很麻烦。当然这种方式只要脚本使用的语言和执行环境支持动态加载、释放,都可以热更新脚本。c#/.net也可以的,不过它不是为了当脚本设计的,所以用起来不是很方便。