背景

我们知道Unity3d是通过C#脚本语言的形式来实现游戏的逻辑代码编写,同样SCOTT服务器也设置了通过C#脚本来实现游戏逻辑,但是本文并不是想真正分析解密他们的运行机制,只是想通过自己的一个需求,来探讨总结下其中的原理。

下面来说下我自己的需求,比较简单,由于经常在非开发环境部署一些小工具,做系统维护,但每次又懒得带笔记本和编译环境到现场,但系统数据又总是那么奇葩,时常有bug出现,突发奇想是否是能把工具做成脚本,这样现场就很容易进行调整(简单修改脚本),现场搞定不用来回折腾,岂不是很Happy。

原理

Unity3d使用的Mono这个地球人知道,Scott呢?我以前分析过其源码,大概知道它需要兼容IconPyhton和C#两种脚本,所以它做了一层封装,但是看它引用的DLL lib有Mono的影子,所以估计也是Mono(不对请拍砖,其实它用什么无所谓了)。实际原理很简单了,也就是脚本动态编译(有点像解释执行,严格上应该不是,我觉得李总的热更新的脚本应该不是动态编译的因为很多平台根本不支持比如IOS),查了下资料目前c#动态编译的一共三种方式CodeDom,Mono,Roslyn,这三种教程应该是一堆一堆的,但是Mono和Roslyn的都不是很多,毕竟这个需求比较小众,而且Roslyn是最新出来的,例子都是“Hello world”级别的让人很不爽,最后发现一个库CS-Script,看了下文档,瞟一眼代码:CSScript.EvaluatorConfig.Engine = EvaluatorEngine.Roslyn;

//EvaluatorEngine.Mono;

//EvaluatorEngine.CodeDom;

var sqr = CSScript.Evaluator

.CreateDelegate(@"int Sqr(int a)

{

return a * a;

}");

var r = sqr(3);

看到1,2,3行代码的时候,我会心的笑了,实际上CS-Script是对于三种方式的上层封装,可以自定义选择用那一种,这个方案对于我的已经够用了。下面就是做个试验,然后实施即可。

试验

详细的步骤教,我不想多说了CS-Script有自己详细的教程。由于本人的需求是使用自己写的代码调用脚本,这里就不讲通过命令执行脚本的东东了。

第一步安装,创建一个控制台项目,然后使用nuget进行CS-Script的安装,在程序管理控制台执行

Install-Package CS-Script

Nuget会自动下载相关的DLL和Example脚本到项目中很简单,结果如下

其中下面上个脚本是自动添加的例子程序,打开看看很简单,这里就不表了

在Main函数中添加如下代码,测试(这里编译竟然发现有错误,可能是缺Roslyn引用,无卵用,直接剔除或者注释)static void Main(string[] args){    HostApp.Test();}

执行效果如下,具体可以看Test中的方法就是一些如何动态执行类,方法,静态方法,接口等等简单例子吧,对于我们的简单需求已经够用了(如果有复杂需求比如Host,上下文,高级动态编译什么的请看文档,这里估计也讲不下)

至此简单的测试环境已经有了

实施

根据官方的例子稍微做一下改造,修改Main函数如下:

在bin下写一个自己的Hello.cs脚本:

创建一个批处理执行,以便把文件名称作为动态参数传入,执行效果如下

这里需要注意的是脚本的文件格式别忘记是utf-8的格式,不然中文会乱码的。

应用

上文中的脚本运行模板写基本完成了,这样只要将自己需执行的工具代码,放到单独的类中,然后启动函数为Run即可,这样只要在Dos批处理脚本中修改c#代码文件的相应名称就可以按照脚本执行了,下面是我的工具脚本代码(是一个压缩二级目录的C#源码):

满心欢喜,可结果可耻的失败了

分析其原因主要是我在Myscript脚本中使用了另一个c#类文件中的相关函数,也就是上图中的红色框标注出的代码,实际上这里是一个上下文缺失(或者是host问题),这里的解决办法一种是动态添加Assembly;一种是使用DLL。这里为了简单,我选择第二种方法。这里假设ZipUtil是一种公用类库,我将其封装到独立的DLL中,作为类库引用到工程中去。运行结果和预想的一样执行成功了(So happy)

这里也体现了CS-Script的强大,动态的就管理了第三方应用的DLL竟然不需要做任何处理,赞一个!

总结

至此,使用CS-Script这个工具,很Easy就实现了C#脚本的动态调用和执行,也抛砖引玉引入了C#作为脚本动态编译执行的原理和过程,当然复杂的应用还有很多,比如执行效率,热插拔更新,高级动态编译,上下文这里留给大家自己研究吧。

对本人来说作为自己的需求已经达到,对于动态执行C#脚本也有了更深刻的认识,特别是通过排错的过程,更加深刻的认识到使用脚本的前提和环境是什么:脚本最好是一个单独的C#文件即可(多了就失去了脚本的意义,也没有必要);脚本的使用是在有完善的类库的前提下,通过脚本来实现多变的逻辑,如果类库不够成熟稳定还是不要使用脚本了(这里可以参考下Scott至少它提供了Framework级别的库)

游戏c#脚本语言,C#作为脚本语言执行解密相关推荐

  1. 什么是脚本语言,shell脚本又是什么?

    脚本语言就是解释型语言: 脚本语言(Script language,scripting language,scripting programming language)是为了缩短传统的编写-编译-链接 ...

  2. Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本

    Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本 首先参考http://wiki.chumby.com/index.php?title=Lua&print ...

  3. Windows PowerShell 2.0语言开发之脚本块

    脚本块是重要的编程结构,是PowerShell重要的摘要和重用代码的机制,学习脚本块的最终目标是掌握各种重用代码的方法,如别名程序提供和脚本文件.这些技术都很重要,因为它们是逐步创建复杂脚本的基础. ...

  4. 揭秘!用标准Go语言能写脚本吗?

    导语 | Go作为一种编译型语言,经常用于实现后台服务的开发.由于Go初始的开发大佬都是C的老牌使用者,因此Go中保留了不少C的编程习惯和思想,这对C/C++ 和PHP开发者来说非常有吸引力.作为编译 ...

  5. 汇编语言、高级语言(系统语言)、脚本语言的异同

    汇编语言.高级语言(系统语言).脚本语言的异同 高级语言主要指需要编译的语言.如C/C++,Java,C#.脚本语言主要指解释型语言,编写的代码无需编译器编译,直接使用解释器放入虚拟机执行. 高级语言 ...

  6. 用go语言编写办公脚本——根据txt内容搜索对应文件

    用go语言编写办公脚本--根据txt内容搜索对应文件 最近工作中,需要处理大量的漏扫报告,需要根据不同的标准来将混在一起的报告分开,公司有个大佬直接写了.bat的批处理脚本,感叹一句,真强啊!!但是这 ...

  7. 在Linux中如何运行C语言写的脚本

    目录 1:Linux下如何运行C语言脚本 2:实例展示 1:Linux下如何运行C语言脚本 Linux别的系统我不知道是不是这个方法,我是用的ubuntu的,其他的我也没测试过,但是ubuntu应该是 ...

  8. 制作一个多语言谷歌翻译 脚本

    1.修改host文件:C:\Windows\System32\drivers\etc 加入以下配置 # google translate 203.208.40.66 translate.google. ...

  9. c语言入门经典 脚本之家,一个不错的shell 脚本教程 入门级_其它_脚本之家

    建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用.所以在本文中笔者所提供的 ...

最新文章

  1. topcoder srm 330 div1
  2. 速卖通关键词挖掘工具_网站优化必备的关键词挖掘工具
  3. js 事件流的事件冒泡和事件捕获与阻止事件传播
  4. 带你认识Linux安全渗透,秒懂的那种
  5. 云炬Android开发笔记 11主界面-商品分类开发(多布局Section RecyclerView)
  6. python partial_Python--并行计算框架(pathos)
  7. 如何查看centos安装了哪些程序
  8. 实现 int 类型(比如id)的模糊查询
  9. 汇编语言 王爽 第四版 第二章 检测点2.1
  10. 基于WIKI中文语料·Word2Vec模型训练·Python
  11. 深入解析内存原理:DRAM的基本原理
  12. glassfish插件_Maven嵌入式Glassfish插件-未启动
  13. 工控机与arm主板有什么不同
  14. matlab(1):使用matlab处理excel数据进行画图
  15. 北斗卫星导航产业重大应用示范项目落户哈市
  16. 如何解压tar.gz文件或是.gz文件
  17. 什么是GML?GML例子
  18. 5.1 再谈import和print
  19. 人力资源数据可视化技术架构
  20. AtCoder Beginner Contest 254 A~E 题解

热门文章

  1. matlab读入三维点云数据斯坦福兔子
  2. 【解决】敬业签Windows电脑桌面便签软件安装不能打开要写入的文件问题造成桌面便签软件安装失败的解决办法
  3. 如何把WORD文档中的其中一页转为横向,其它页不变,仍为纵向
  4. pinyin4j:拼音与汉字的转换实例
  5. node.js邮箱验证码
  6. uniapp onChooseAvatar,uniapp微信头像昵称填写,uniapp chooseAvatar,does not have a method “onChooseAvatar“
  7. 基于JavaScript+css写一个简单的h5动态下雨效果
  8. HDU4544 湫湫系列故事——消灭兔子
  9. 【VMware】win 10:解决 win 7 虚拟机系统屏幕没有适应 vmware 窗口全屏问题
  10. 服务器时间 验证码不显示,时间不同步导致网页验证码不能正常显示解决方法...