Javascript.NET(V8Wrapper) 更新,自定义映射别名
历史版本
之前的两篇文章分别介绍了Google的V8引擎,和开源的Javascript.NET(V8的.NET的Wrapper)。我在这两者的基础上进行了一个高层包装(Efreda.Script),并优化了部分代码,解决了原版Wrapper的一些异常,今天主要是对Efreda.Script进行了一些更新,以便更方便的在开发当中使用。
自定义映射别名
有使用了这个库的朋友向我反映,如果不加在全局程序集,则在JS当中实例化.NET类会相当的麻烦,例如要用到下面的代码。
1 2 3 4 5 6 | function testCreateByFullName() { var proc=$.Create( "System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" , null ); proc.StartInfo.FileName= "calc" ; proc.Start(); } |
每次都必须写一长串这样的名称,实在是降低了开发效率。
如果在每次程序启动去加载全局程序集,问题也比较大,因为整个.NET的程序集相当多,这样的话,又费时间又费内存(大概需要5-10秒左右的时间来加载程序集,大大降低了程序的运行效率),虽然可以做一个启动画面来让用户等待,但是对于一些小程序来说,这样的做法未免太浪费资源了。
之前恰好看到了一篇开源的.NET脚本引擎,对于在脚本当中实例化.NET的Class,它使用了别名的方式,于是,我也重新增加了这样的方式,可以通过代码来添加映射,也可以通过配置文件来添加,具体代码如下。
通过配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | < configSections > < section name="Script" type="Efreda.Script.ScriptSection,Efreda.Script"/> </ configSections > <!--脚本引擎配置--> <!-- 参数说明: StartEngine:是否启动脚本引擎 RelativePath:是否为相对路径 ScriptPath:脚本目录,根据RelativePath填写相对或绝对路径,相对路径只需要填写脚本目录名称即可 CreateGACMapping:是否创建全局程序集映射,该操作耗时5-10秒,如果创建了映射,则可以简单的通过限定名称(命名空间+类名)在JS中实例化.NET类,而无需 指定强名称 CreateMappingAsyn:是否通过异步方式创建映射,以免阻塞主线程 --> < Script StartEngine="True" RelativePath="True" ScriptPath="Scripts" CreateGACMapping="False" CreateMappingAsyn="False"> < Map Alias="Process" Type="System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </ Script > |
通过代码:
1 | JScriptManager.AddMap("Math", "System.Math, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); |
在JS脚本当中实例化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function testACreate() { var proc=$.ACreate( "Process" , null ); proc.StartInfo.FileName= "calc" ; proc.Start(); } function testAStaticMethod() { var arg= new Array(); arg[0]=-25; var rtv=$.AStaticMethod( "Math" , "Abs" ,arg); return rtv; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?