nsjsdotnet 从“hello world!”开始

       nsjsdotnet 是这段时间我耗费很多精力做的一套基于chrome-v8的“JavaScript”虚拟机开发框架,它的诞生受限于很多的因素让我很难受、无奈,我想我应该不会在业务场景大量的使用dotNET 虽然是我是如此的深爱这个东西。

       nsjsdotnet 是类似 nodejs 的东西但又不同 它与 nodejs 从设计的概念上讲就不是同类型的东西 它不推崇完全异步编程 因为这会提高编码门槛,降低代码可读性,同时调试的难易度的问题 它推荐开发人员可以选择平衡(场景适合)的办法来解决问题,你可以在同一个宿主进程内运行多个虚拟机以获取更好的效率。

       nsjsdotnet 它可以是一个单纯的虚拟机开发框架也可以不是它包含一个持续开发的基础的运行时框架库 而我希望有更多的人可以为“JavaScript”提供的更多更好用的“FCL/BCL”。

       你可以从这里获取到它的开源代码: https://github.com/liulilittle/nsjs

      它使用GUN3开源协议但它利用这个协议仅仅只是希望你可以开放你对它的改进与扩充的“运行时框架”的代码,但不一定是强制性的 但需要声明你使用到了它与它的开源地址。

      目前没有编写相关的文档主要是没有时间,这个东西目前主要服务于咱家的公司里头所以有很多开发的基础框架与轮子并没有真的添加到里面去。

     而目前的github上开放的代码“基础的运行时框架”是支持例如“数据库”、“文件”、“套接字”、“http服务器”、“编码转换”、“AES/RC4/SHA/MD5”这些基本服务器开发需要的东西的。

      natives_blob.bin, snapshot_blob.bin, nsjs.dll 三个文件需要放到你的build后的应用的执行文件目录下 另一点是需要说明的是github上提供的nsjs.dll是“x64/release”版本,如果你需要x86(IA32)平台的版本你可以利用开源的“nsjs”的C/C++代码配合“chrome-v8”用Microsoft Virtual Studio 2015(msvs2015) build。

       示例:

namespace TECHMARS.VM
{
    using nsjsdotnet;
    using System;

    class Program
    {
        static void __hashcode(NSJSFunctionCallbackInfo arguments) // 您可以指定此类函数声明,它会由框架从托管对象与非托管对象之间进行“P/Invoke MarshalAs”计算。
        {
            Console.WriteLine("hashcode: "+ arguments[0].GetHashCode()); // 您可以利用索引器访问一个具体“solt”位的变量,“solt”是从“0”位向后扩张(顺序是从低到高)。
        }
        static void __typeof(IntPtr info) // 此为经典的结构,框架建议您使用此类函数声明它可以获得更好的效率同时避免恶意的“dotNET”层面第三方调用。
        {
            NSJSFunctionCallbackInfo arguments = NSJSFunctionCallbackInfo.From(info); // 您可以通过此静态友元方法,将非托管对象计算成“dotNET”可理解的托管对象。
            Console.WriteLine("typeof: " + NSJSValue.TypeOf(arguments[0]));
        }
        [MTAThread] /* 建议您的虚拟机运行于“MTAThread”的环境下,否则您可能会遭遇到“STAThread”工作消息磅阻塞过长的异常,若您仅仅只是希望预备一个虚拟机用于投入
                     * 使用而不考虑其它,那么您只需要在入口函数处显示声明为“MTAThread”将虚拟机运行在主线程上。
                     */
        static void Main(string[] args)
        {
            NSJSVirtualMachine nsjs = new NSJSVirtualMachine(); // 预备一个欲投入使用的虚拟机。
            nsjs.AddFunction("__typeof", // 永久“钉住”此函数委托及其“JIT/Stub”,否则“GC”可能会选择移动你的函数在“RING3”应用层的虚拟内存位置且重新修正“RVA”偏移。
                NSJSPinnedCollection.Pinned<NSJSFunctionCallback>(__typeof)); 
            nsjs.AddFunction("__hashcode", // 向虚拟机的global域添加函数(例如浏览器内核向global域添加window、location对象是相同的)。
                NSJSPinnedCollection.Pinned<NSJSFunctionCallback2>(__hashcode));
            nsjs.Run(@"                   /* 执行您想要的代码表达式一般称为“shellcode”,此为快速构建运行的示例。 */
                'use strict'
                class Foo {
                    Say() { console.log('hello world!'); }
                }
                let foo = new Foo();
                foo.Say();
                __typeof(foo);
                __hashcode(foo);
            ");
            Console.ReadKey(false);
        }
    }
}

 上述运行结果如下:

扫描二维码关注公众号,回复: 1597684 查看本文章

        

猜你喜欢

转载自blog.csdn.net/liulilittle/article/details/80350476