ChakraCore ,Net托管编程
前言
有些有着复杂业务逻辑的应用程序,需要为用户提供高度自定化的功能。比如像Word中的宏,当然可以自己设计一套简易的脚本解析引擎,但考虑通用性,成熟度,其实选择一款JS脚本引擎,直接嵌入到应用系统中可能来得更加合适。这里介绍一下ChakraCore的项目,是一个基于.Net 的JS引擎。
代码展示
ChakraCore的js引擎实现了应用程序中的脚本处理,其基本使用方式,由宿主程序提供外部对象和变量,由用户提供脚本,通过宿主交由JS引擎去执行,再将执行结果通过回调函数反馈给宿主。以下代码是一个简单的示例:
设置全局变量
setTitleDelegate = SetTitle;
alertDelegate = ShowMessage;
context = runtime.CreateContext();
JavaScriptContext.Current = context; JavaScriptValue globalObject = JavaScriptValue.GlobalObject; windowId = JavaScriptPropertyId.FromString("window"); JavaScriptValue window = JavaScriptValue.CreateObject(); var type = this.GetType();
var ps = type.GetProperties();
foreach (var p in ps)
{
if (p.GetMethod != null && p.GetMethod.IsPublic)
{
var v = p.GetValue(this) ?? "";
window.SetProperty(JavaScriptPropertyId.FromString(p.Name.ToLower()), JavaScriptValue.FromString(v.ToString()), true); }
}
globalObject.SetProperty(windowId, window, true); globalObject.SetProperty(JavaScriptPropertyId.FromString("set_Title"), JavaScriptValue.CreateFunction(setTitleDelegate, IntPtr.Zero), true);
globalObject.SetProperty(JavaScriptPropertyId.FromString("alert"), JavaScriptValue.CreateFunction(alertDelegate, IntPtr.Zero), true);
回调函数
private JavaScriptValue SetTitle(JavaScriptValue callee, bool isConstructCall, JavaScriptValue[] arguments, ushort argumentCount, IntPtr callbackData)
{
for (uint index = 1; index < argumentCount; index++)
{
Title = (arguments[index].ConvertToString().ToString());
} return JavaScriptValue.Invalid;
}
调用代码
string script = scripts.Text;
JavaScriptValue window = JavaScriptValue.GlobalObject.GetProperty(windowId); var jv = JavaScriptContext.RunScript(script);
var type = this.GetType();
var ps = type.GetProperties();
foreach (var p in ps)
{
if (p.SetMethod != null && p.SetMethod.IsPublic)
{
var id = JavaScriptPropertyId.FromString(p.Name.ToLower());
if (id != JavaScriptPropertyId.Invalid)
{
var v = window.GetProperty(id);
if (p.PropertyType.IsAssignableFrom(typeof(string)))
{
p.SetValue(this, v.ToString());
}
}
}
}
ChakraCore ,Net托管编程的更多相关文章
- C# 托管和非托管混合编程
在非托管模块中实现你比较重要的算法,然后通过 CLR 的平台互操作,来使托管代码调用它,这样程序仍然能够正常工作,但对非托管的本地代码进行反编译,就很困难. 最直接的实现托管与非托管编程的方法就是 ...
- 利用C#Marshal类实现托管和非托管的相互转换
Marshal 类 命名空间:System.Runtime.InteropServices 提供了一个方法集,这些方法用于分配非托管内存.复制非托管内存块.将托管类型转换为非托管类型,此外还提供了在与 ...
- [C++/CLI编程宝典][2]什么是C++/CLI语言
对于什么是C++/CLI,我们首先能够简单的将其名字划分为两部分来理解,第一,C++,我们熟悉的眼下被广泛使用的面向对象的ISO国际标准的高级语言,也称为ISOC++,我们这里以后均称其为ISOC++ ...
- 托管C++、C++/CLI、CLR
1.什么是托管C++? 在回答这个问题,首先要搞清楚什么是"托管"(Managed).托管是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,因此我们完 ...
- .NET并发编程-数据结构不可变性
本系列学习在.NET中的并发并行编程模式,实战技巧 内容目录 .NET不可变集合.NET并发集合函数式数据结构设计一个不可变类 作为程序员经常遇到产品上线后出现各种莫名其妙的问题,在我本地是好好的啊, ...
- 浅尝辄止——使用ActiveX装载WPF控件
1 引言 使用VC编写的容器类编辑器,很多都可以挂接ActiveX控件,因为基于COM的ActiveX控件不仅封装性不错,还可以显示一些不错的界面图元. 但是随着技术不断的进步,已被抛弃的Active ...
- SQL Server 2012实施与管理实战指南(笔记)——Ch6连接的建立和问题排查
6.连接的建立和问题排查 会话的建立分成2个部分: 1.连接,即找到这个实例 2.认证,告诉sql server谁要连接 目录 6.连接的建立和问题排查 6.1协议选择和别名 6.1.1 服务器网络配 ...
- WPF 核心体系结构
WPF 体系结构 主题提供 Windows Presentation Foundation (WPF) 类层次结构,涵盖了 WPF 的大部分主要子系统,并描述它们是如何交互的. System.Obje ...
- Marshal 类的内存操作的一般功能
Marshal类 提供了一个方法集,这些方法用于分配非托管内存.复制非托管内存块.将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法. 命名空间:System.Runtim ...
随机推荐
- 撩课-Web大前端每天5道面试题-Day16
1.for循环中的作用域问题? 写出以下代码输出值,尝试用es5和es6的方式进行改进输出循环中的i值. ; i<=; i++) { setTimeout(function timer() { ...
- Hive & SparkSQL 比较
Hive 在 Hadoop 集群上所有数据的访问都是通过 Java 编写的 MapReduce 作业来完成的,这些让 Java 程序员来完成没有问题. 但是对 SQL 程序员来说,写 MapRedu ...
- Oracle数据库web维护管理及监控
1.Oracle数据库客户端的种类及现状 目前Oracle数据库维护管理,通常是使用客户端软件:PL/SQL Developer,SQL* Plus,toad,em等进行数据的管理.维 ...
- sql:PostgreSQL
PostgreSQL sql script: -- Database: geovindu -- DROP DATABASE geovindu; CREATE DATABASE geovindu WIT ...
- Maven学习总结(二):安装
一:Maven下载 下载地址:http://maven.apache.org/download.cgi 下载完成后,得到一个压缩包,解压,可以看到maven的组成目录 Maven目录分析 bin:含有 ...
- react打包开发文件的步骤(上传给线上环境)
cd进入ReleaseProject目录,然后运行npm start,系统会自动在public目录下面完成打包工作,然后我再把 public文件下压缩位public.rar上传即可:(public文 ...
- vue2.0路由写法
// 0. 如果使用模块化机制编程,導入Vue和VueRouter,要调用 Vue.use(VueRouter) // 1. 定义(路由)组件. // 可以从其他文件 import 进来 var Fo ...
- PID控制算法
PID控制算法 四轴如何起飞的原理 四轴飞行器的螺旋桨与空气发生相对运动,产生了向上的升力,当升力大于四轴的重力时四轴就可以起飞了. 四轴飞行器飞行过程中如何保持水平: 我们先假设一种理想状况:四个电 ...
- Week1——JavaEE
本科目标 首先,对我来说自己想走的方向是JavaWeb后台开发,因此JavaEE对我来说也是比较重要的,想学好这门课.进一步巩固自己现有的基础知识,完善自己的项目经验,更加熟悉开发流程.在框架方面我还 ...
- iis7 未注册framework4 导致 莫名的404错误
server2008 R2 IIS7 已经安装 安装framework 4.6.1 然后建立站点 404错误 :在站点目录自动生成了 asp_client 重新注册到 iis(不需要) iisre ...