专栏首页林德熙的博客dotnet 使用 ClearScript 执行 VBScript 和 JS 代码 无需浏览器

dotnet 使用 ClearScript 执行 VBScript 和 JS 代码 无需浏览器

小伙伴都知道,使用 JS 的坑在于执行效率过低,速度过慢。如果是在客户端中,还开启一个浏览器,整个应用程序就会特别重。有没有什么方法可以让 dotnet 作为容器,执行 JScript 代码而不需要浏览器?其实有的,因为 VBScript 和 JS 代码都很好解析,所以有 ClearScript 支持使用 dotnet 解析代码执行

如何将 VBScript 和 JS 代码编译为 IL 或如何在 C# 和 dotnet 中嵌入 js 代码是不靠谱的,因为 js 语言设计如此,是用来在 基组模块 层运行的语言,也就是这是一个解析型的脚本,更好地做法是给他实现一个解析库。通过解析库将代码解析为数据,在根据数据调用已经写好的代码,这样就能实现在 dotnet 中运行 js 代码了。实现这个方式有两个不同方法,第一个方法使用的最多的,就是在 dotnet 中添加一个浏览器让他执行代码,这个方法的缺点就是性能特别渣,无论是内存占用或 CPU 占用都是特别渣。我作为性能优化组的逗比,只能去寻找第二条路径,毕竟需要照顾一些只会写 js 的大佬。第二个方法是通过 dotnet 解析器解析 js 代码的方法,推荐使用 ClearScript 库,这个库十分好用,可以给 js 注入执行的类或实例包括库,这样可以让贫瘠的 js 可以用到更多的 dotnet 的强大的库。同时可以杂私货,注入自己实现的类等。因为可以选择注入执行的类,所以可以让一些如文件访问相关的库不要直接注入,而是注入自己封装的文件访问相关的库,解决不安全的 js 带毒的问题

先创建一个 dotnet 项目,然后通过 NuGet 安装 Microsoft.ClearScript

然后就可以在代码中运行 VBScript 代码或 js 代码了

                // expose a host type
                engine.AddHostType("Console", typeof(Console));

                engine.Execute("Console.WriteLine('{0} is an interesting number.', Math.PI)");

可以注入自己创建实例

                // expose a host object

                engine.AddHostObject("random", new Random());

                engine.Execute("Console.WriteLine(random.NextDouble())");

可以给其他库

               engine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core"));

                engine.Execute("Console.WriteLine(lib.System.DateTime.Now)");

                // create a host object from script

                engine.Execute(@"

        birthday = new lib.System.DateTime(2007, 5, 22);

        Console.WriteLine(birthday.ToLongDateString());

    ");

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 程序猿修养 从安装 dotnet 开始

    本来程序员的开始应该是从命令行开始,但是能看到博客的小伙伴,预计都了解命令行了。但是如果是一个空命令行,能做的事情实在不够清真,能提升的效率也有限。如何站在巨人...

    林德熙
  • 一些好用的 dotnet tool 工具

    javadparvaresh/dotnet-exec: Execute shell script as dotnet tasks

    林德熙
  • dotnet 用 NuGet 将自己的工具作为 dotnet tool 分发

    我写了一个有趣的工具,我如何将这个工具给到小伙伴予力众生呢?只需要设定这个工具是 dotnet tool 工具就可以通过 NuGet 分发出去啦。几乎所有的 d...

    林德熙
  • Python3学习笔记 | 三、Python的类型与运算-动态类型简介

    变量:在Python里,不像别的一些语言,需要声明变量类型。因为在Python里变量没有类型。 变量创建:当第一次赋值给一个变量的时候,它就自动被创建了。 变量...

    TeamsSix
  • Xcode7 无开发者证书真机调试

    2、用Apple ID登录https://developer.apple.com/,同意成为开发者的条款

    动动我试试
  • go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?

    在上篇文章中,我们编撰了一则简短的小故事用于讲解了什么是面向对象的继承特性以及 Go 语言是如何实现这种继承语义的,这一节我们将继续探讨新的场景,希望能顺便讲解...

    雪之梦技术驿站
  • 最新深度学习合集:GitHub趋势排行第一位,仅两天斩获2000+Star!

    国外大佬 Sabastian Raschka (威斯康星大学统计学助理教授、《Python of Machine Learning》 作者)最近在 GitHub...

    用户2769421
  • Android网络编程(一)HTTP协议原理

    前言 这篇文章是这个系列的开篇,作为移动开发者,开发的应用不免会对网络进行访问,虽然现在已经有很多的开源库帮助我们可以轻而易举的访问网络,但是我们仍要去了解网络...

    用户1269200
  • zephir-(3)你的第一个PHP拓展

    #zephir-你的第一个PHP拓展# ? ##前言## 先在这里感谢各位zephir开源技术提供者 在之前的介绍中大家不仅了解了zephir具体是一个什么样的...

    喵了个咪233
  • 人工智能-应用场景

    iOSDevLog

扫码关注云+社区

领取腾讯云代金券