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 ...
随机推荐
- 基于 java 【Web安全】文件上传漏洞及目录遍历攻击
前言:web安全之文件上传漏洞,顺带讲一下目录遍历攻击.本文基于 java 写了一个示例. 原理 在上网的过程中,我们经常会将一些如图片.压缩包之类的文件上传到远端服务器进行保存.文件上传攻击指的是恶 ...
- ARP原理和欺骗
ARP--在TCP/IP协议栈中,最不安全的协议莫过于ARP了,我们经常听到的网络扫描,内网***,流量欺骗等等,他们基本上都与ARP有关系,甚至可以说,他们的底层都是基于ARP实现的.但是ARP的是 ...
- MYSQL-EXPLAIN 命令详解 (转载)
EXPLAIN 命令详解 在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描, ...
- 浅谈 Linux 下的 SSH1, SSH2
SSH:Secure Shell .是一种安全协议. 常见的应用场景是远程控制台登陆. SSH1免费,SSH2收费. 其实 SSH 并不只是在 Linux 和 Unix 下使用,他们同样在 Win ...
- Thymeleaf学习记录(3)--语法
语法: 标准表达式语法 简单表达: 变量表达式: ${...} 选择变量表达式: *{...} 消息表达式: #{...} 链接网址表达式: @{...} 字面 文本文字:'one text','An ...
- Drupal网站报错:PDOException: in lock_may_be_available()
Drupal网站报错: 原因: windows中mysql的服务停止了: 解决办法: 在服务中,启动mysql服务 启动后,刷新页面,问题完美解决
- 从零开始安装、编译、部署 Docker
简介 主要介绍如何从基础系统debian部署docker关于docker基础知识在 相关资料 里有链接 安装docker 1.使用root用户身份添加apt源添加public key使docker的安 ...
- Ubuntu 安装 PhpMyAdmin 图文教程
Ubuntu 安装 PhpMyAdmin 管理 MySQL 数据库 PhpMyAdmin 是一个用 PHP 编写的软件工具,可以通过 web方式控制和操作 MySQL 数据库.通过 phpMyAdmi ...
- 在小程序中修改上一个页面里data中的数据调用上一个页面的方法
//获取已经打开的页面的数组 var pages = getCurrentPages(); //获取上一个页面的所有的方法和data中的数据 var lastpage = pages[pages.l ...
- MSSQL->serverlink[Oracle]
需求描述: SQL Server数据库连接Oracle数据库 条件准备: SQL Server数据库,SQL Server 2008R2 Oracle数据库,Oracle ...