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 ...
随机推荐
- mysql数据库重点(基础优化)
### Mysql性能优化 尽量不要写select * ,如果需要全表数据,使用select 加所有字段列名称查询代替* 尽量减少字段列的数学计算,如:where num * 2 >= 30,可 ...
- MySQL 数据类型总结及选取准则
整数 整数有 TINYINT, SMALLINT, MEDIUMINT, INT 和 BIGINT 类型. 占用 8 , 16 24, ...
- Excel2010条件格式的位置
以下是excel2010的条件格式设置方法(英文版) 具体使用方法可以参考 http://office.microsoft.com/zh-cn/excel-help/HA102809768.aspx
- Spring入门(一)— IOC、DI
一.Spring介绍 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成 ...
- Hibernate入门(四)—— 查询
一.Hibernate查询 1.Hibernate检索(查询)方式的分类 OID检索 :根据主键查询,get/load 对象导航检索 :通过一个对象获得其关联对象.[重点] Category cate ...
- 将Windows上的Oracle迁移至Linux
迁移前提: 1.在安装Linux数据库实例时,注意选择的编码格式要与Windows的数据库实例一致. 迁移步骤 1.检查Linux上数据库实例的编译格式 SQL> select userenv( ...
- Luogu4433:[COCI2009-2010#1] ALADIN(类欧几里德算法)
先套用一个线段树维护离散化之后的区间的每一段的答案 那么只要考虑怎么下面的东西即可 \[\sum_{i=1}^{n}(A\times i \ mod \ B)\] 拆开就是 \[\sum_{i=1}^ ...
- JavaScript的进阶之路(七)客户端JavaScript知识点总结
一.客户端JavaScript主要是BOM DOM的操作和js脚本的兼容性.互用性.可访问性.安全性的应用.以及一些框架的引用. 二.BOM:浏览器对象模型 主要介绍window对象 1.定时器:se ...
- Spring mvc与Struts2的比较
1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. 2. 性能:spring会稍微比struts快.spring mvc是基于方法的设 ...
- 解决 客户端连接 mysql5.7 Plugin 'mysql_native_plugin' is not loaded错误
进入mysql数据库,修改数据库的内容 1, use mysql; 2,update user set authentication_string="" where User= ...