【转】第4篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:委托回调方法分析

第4篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:委托回调方法分析
本文转自“吾乐吧软件站”,原文链接:http://www.wuleba.com/?p=23620
感兴趣的,可以加入:WebKit/Blink 内核浏览器开发 QQ交流群:244840771
开发语言为:.NET/C++ 方向
2、第二种方法,委托回调方法分析
2.1 实现过程:
(1)、定义一个DemoRenderProcessHandler,继承自CefRenderProcessHandler
(2)、重写DemoRenderProcessHandler里的OnWebKitInitialized ( )事件
(3)、定义一个ExampleAv8Handler,继承自CefV8Handler
(4)、在ExampleAv8Handler里的Execute ( )事件中,写你要执行的操作代码
(5)、在Execute ( )事件中,利用委托进行回调,把要操作的代码回调执行
(6)、在OnWebKitInitialized ( )事件里面new ExampleAv8Handler ( ),根据类的实际情况,人工手写JS脚本代码,通过官方提供的RegisterExtension(string extensionName, string javascriptCode, CefV8Handler handler)方法进行注册
(7)、写一个网页,去前台通过JS调用
2.2 核心代码:
/// <summary>
/// DemoRenderProcessHandler.cs
/// </summary>
#region 声明委托回调
/// <summary>
/// 网页脚本与后台程序交互方法
/// 提示一:V8HandlerDelegate要在namespace下面定义,不要写到class里去了
/// 提示二:如果 returnValue = null; 则会导致网页前端出现错误:Cannot read property ’constructor’ of undefined
/// 提示三:还存在其他的可能,导致导致网页前端出现错误:Cannot read property ’constructor’ of undefined
/// </summary>
/// <param name=”name”>名称</param>
/// <param name=”obj”>对象</param>
/// <param name=”arguments”>参数</param>
/// <param name=”returnValue”>返回值</param>
/// <param name=”exception”>返回异常信息</param>
/// <returns></returns>
public delegate void V8HandlerDelegate(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception);
#endregion 声明委托回调
#region 声明常量变量
/// <summary>
/// 绑定测试处理器B
/// </summary>
private ExampleBv8Handler exampleB;
/// <summary>
/// 委托回调
/// </summary>
public V8HandlerDelegate CallBack { get; set; }
#endregion 声明常量变量
protected override void OnWebKitInitialized()
{
#region 回调方式注册 ExampleB
exampleB = new ExampleBv8Handler { CallBack = CallBackMethod };
const string exampleBJavascriptCode = @”function exampleB() {}
if (!exampleB) exampleB = {};
(function() {
exampleB.__defineGetter__(‘myProperty’,
function() {
native function MyProperty();
return MyProperty();
});
exampleB.__defineGetter__(‘myReadOnlyProperty’,
function() {
native function MyReadOnlyProperty();
return MyReadOnlyProperty();
});
exampleB.__defineGetter__(‘myUnconvertibleProperty’,
function() {
native function MyUnconvertibleProperty();
return MyUnconvertibleProperty();
});
exampleB.repeat = function(str,n) {
native function Repeat(str,n);
return Repeat(str,n);
};
exampleB.echoVoid = function() {
native function EchoVoid();
EchoVoid();
};
exampleB.echoBoolean = function(arg0) {
native function EchoBoolean(arg0);
return EchoBoolean(arg0);
};
exampleB.echoNullableBoolean = function(arg0) {
native function EchoNullableBoolean(arg0);
return EchoNullableBoolean(arg0);
};
exampleB.echoSByte = function(arg0) {
native function EchoSByte(arg0);
return EchoSByte(arg0);
};
exampleB.echoNullableSByte = function(arg0) {
native function EchoNullableSByte(arg0);
return EchoNullableSByte(arg0);
};
exampleB.echoInt16 = function(arg0) {
native function EchoInt16(arg0);
return EchoInt16(arg0);
};
exampleB.echoNullableInt16 = function(arg0) {
native function EchoNullableInt16(arg0);
return EchoNullableInt16(arg0);
};
exampleB.echoInt32 = function(arg0) {
native function EchoInt32(arg0);
return EchoInt32(arg0);
};
exampleB.echoNullableInt32 = function(arg0) {
native function EchoNullableInt32(arg0);
return EchoNullableInt32(arg0);
};
exampleB.echoInt64 = function(arg0) {
native function EchoInt64(arg0);
return EchoInt64(arg0);
};
exampleB.echoNullableInt64 = function(arg0) {
native function EchoNullableInt64(arg0);
return EchoNullableInt64(arg0);
};
exampleB.echoByte = function(arg0) {
native function EchoByte(arg0);
return EchoByte(arg0);
};
exampleB.echoNullableByte = function(arg0) {
native function EchoNullableByte(arg0);
return EchoNullableByte(arg0);
};
exampleB.echoUInt16 = function(arg0) {
native function EchoUInt16(arg0);
return EchoUInt16(arg0);
};
exampleB.echoUInt32 = function(arg0) {
native function EchoUInt32(arg0);
return EchoUInt32(arg0);
};
exampleB.echoNullableUInt32 = function(arg0) {
native function EchoNullableUInt32(arg0);
return EchoNullableUInt32(arg0);
};
exampleB.echoUInt64 = function(arg0) {
native function EchoUInt64(arg0);
return EchoUInt64(arg0);
};
exampleB.echoNullableUInt64 = function(arg0) {
native function EchoNullableUInt64(arg0);
return EchoNullableUInt64(arg0);
};
exampleB.echoSingle = function(arg0) {
native function EchoSingle(arg0);
return EchoSingle(arg0);
};
exampleB.echoNullableSingle = function(arg0) {
native function EchoNullableSingle(arg0);
return EchoNullableSingle(arg0);
};
exampleB.echoDouble = function(arg0) {
native function EchoDouble(arg0);
return EchoDouble(arg0);
};
exampleB.echoNullableDouble = function(arg0) {
native function EchoNullableDouble(arg0);
return EchoNullableDouble(arg0);
};
exampleB.echoChar = function(arg0) {
native function EchoChar(arg0);
return EchoChar(arg0);
};
exampleB.echoNullableChar = function(arg0) {
native function EchoNullableChar(arg0);
return EchoNullableChar(arg0);
};
exampleB.echoDateTime = function(arg0) {
native function EchoDateTime(arg0);
return EchoDateTime(arg0);
};
exampleB.echoNullableDateTime = function(arg0) {
native function EchoNullableDateTime(arg0);
return EchoNullableDateTime(arg0);
};
exampleB.echoDecimal = function(arg0) {
native function EchoDecimal(arg0);
return EchoDecimal(arg0);
};
exampleB.echoNullableDecimal = function(arg0) {
native function EchoNullableDecimal(arg0);
return EchoNullableDecimal(arg0);
};
exampleB.echoString = function(arg0) {
native function EchoString(arg0);
return EchoString(arg0);
};
exampleB.lowercaseMethod = function(arg0) {
native function LowercaseMethod(arg0);
return LowercaseMethod(arg0);
};
})();”;
CefRuntime.RegisterExtension(“exampleBExtensionName”, exampleBJavascriptCode, exampleB);
#endregion 回调方式注册 ExampleB
base.OnWebKitInitialized();
}
#region 方法
/// <summary>
/// 利用委托回调方法
/// 注意:如果 returnValue = null; 则会导致网页前端出现错误:Cannot read property ’constructor’ of undefined
/// </summary>
/// <param name=”name”></param>
/// <param name=”obj”></param>
/// <param name=”arguments”></param>
/// <param name=”returnValue”></param>
/// <param name=”exception”></param>
public void CallBackMethod(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
{
returnValue = CefV8Value.CreateString(string.Empty);
exception = null;
}
#endregion 方法
/// <summary>
/// ExampleBv8Handler.cs
/// </summary>
/// <summary>
/// 绑定测试处理器
/// </summary>
public class ExampleBv8Handler : CefV8Handler
{
#region 声明常量变量
/// <summary>
/// 我的属性
/// </summary>
public int MyProperty { get; set; }
/// <summary>
/// 我的只读属性
/// </summary>
public string MyReadOnlyProperty { get; internal set; }
/// <summary>
/// 我不能转换的属性
/// </summary>
public Type MyUnconvertibleProperty { get; set; }
/// <summary>
/// 委托回调
/// </summary>
public V8HandlerDelegate CallBack { get; set; }
#endregion 声明常量变量
#region 构造函数
/// <summary>
/// 默认构造函数
/// </summary>
public ExampleBv8Handler()
{
MyProperty = 100;
MyReadOnlyProperty = “flydoos@vip.qq.com”;
MyUnconvertibleProperty = GetType();
}
#endregion 构造函数
#region 事件
/// <summary>
/// 网页脚本与后台程序交互方法
/// 提示一:如果 returnValue = null; 则会导致网页前端出现错误:Cannot read property ’constructor’ of undefined
/// 提示二:还存在其他的可能,导致导致网页前端出现错误:Cannot read property ’constructor’ of undefined
/// </summary>
/// <param name=”name”>名称</param>
/// <param name=”obj”>对象</param>
/// <param name=”arguments”>参数</param>
/// <param name=”returnValue”>返回值</param>
/// <param name=”exception”>返回异常信息</param>
/// <returns></returns>
protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
{
returnValue = CefV8Value.CreateNull();
exception = null;
if (CallBack != null)
{
CallBack(name, obj, arguments, out returnValue, out exception);
}
return true;
}
#endregion 事件
#region 方法
/// <summary>
/// 重复叠加字符串
/// </summary>
/// <param name=”str”>字符串</param>
/// <param name=”n”>次数</param>
/// <returns></returns>
public string Repeat(string str, int n)
{
string result = String.Empty;
for (int i = 0; i < n; i++)
{
result += str;
}
return result;
}
/// <summary>
/// 无返回值
/// </summary>
public void EchoVoid()
{
MessageBox.Show(“BindingTestAv8Handler : EchoVoid()”);
}
/// <summary>
/// 返回逻辑型
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Boolean EchoBoolean(Boolean arg0)
{
return arg0;
}
/// <summary>
/// 返回可空逻辑型
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Boolean? EchoNullableBoolean(Boolean? arg0)
{
return arg0;
}
/// <summary>
/// 返回 8 位有符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public SByte EchoSByte(SByte arg0)
{
return arg0;
}
/// <summary>
/// 返回可空 8 位有符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public SByte? EchoNullableSByte(SByte? arg0)
{
return arg0;
}
/// <summary>
/// 返回 16 位有符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Int16 EchoInt16(Int16 arg0)
{
return arg0;
}
/// <summary>
/// 返回可空 16 位有符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Int16? EchoNullableInt16(Int16? arg0)
{
return arg0;
}
/// <summary>
/// 返回 32 位有符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Int32 EchoInt32(Int32 arg0)
{
return arg0;
}
/// <summary>
/// 返回可空 32 位有符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Int32? EchoNullableInt32(Int32? arg0)
{
return arg0;
}
/// <summary>
/// 返回 64 位有符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Int64 EchoInt64(Int64 arg0)
{
return arg0;
}
/// <summary>
/// 返回可空 64 位有符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Int64? EchoNullableInt64(Int64? arg0)
{
return arg0;
}
/// <summary>
/// 返回 8 位无符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Byte EchoByte(Byte arg0)
{
return arg0;
}
/// <summary>
/// 返回可空 8 位无符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Byte? EchoNullableByte(Byte? arg0)
{
return arg0;
}
/// <summary>
/// 返回 16 位无符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public UInt16 EchoUInt16(UInt16 arg0)
{
return arg0;
}
/// <summary>
/// 返回可空 16 位无符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public UInt16? EchoNullableUInt16(UInt16? arg0)
{
return arg0;
}
/// <summary>
/// 返回 32 位无符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public UInt32 EchoUInt32(UInt32 arg0)
{
return arg0;
}
/// <summary>
/// 返回可空 32 位无符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public UInt32? EchoNullableUInt32(UInt32? arg0)
{
return arg0;
}
/// <summary>
/// 返回 64 位无符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public UInt64 EchoUInt64(UInt64 arg0)
{
return arg0;
}
/// <summary>
/// 返回可空 64 位无符号整数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public UInt64? EchoNullableUInt64(UInt64? arg0)
{
return arg0;
}
/// <summary>
/// 返回单精度浮点数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Single EchoSingle(Single arg0)
{
return arg0;
}
/// <summary>
/// 返回可空单精度浮点数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Single? EchoNullableSingle(Single? arg0)
{
return arg0;
}
/// <summary>
/// 返回双精度浮点数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Double EchoDouble(Double arg0)
{
return arg0;
}
/// <summary>
/// 返回可空双精度浮点数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Double? EchoNullableDouble(Double? arg0)
{
return arg0;
}
/// <summary>
/// 返回Unicode字符
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Char EchoChar(Char arg0)
{
return arg0;
}
/// <summary>
/// 返回可空Unicode字符
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Char? EchoNullableChar(Char? arg0)
{
return arg0;
}
/// <summary>
/// 返回时间类型
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public DateTime EchoDateTime(DateTime arg0)
{
return arg0;
}
/// <summary>
/// 返回可空时间类型
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public DateTime? EchoNullableDateTime(DateTime? arg0)
{
return arg0;
}
/// <summary>
/// 返回十进制数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Decimal EchoDecimal(Decimal arg0)
{
return arg0;
}
/// <summary>
/// 返回可空十进制数
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public Decimal? EchoNullableDecimal(Decimal? arg0)
{
return arg0;
}
/// <summary>
/// 返回字符串
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public String EchoString(String arg0)
{
return arg0;
}
/// <summary>
/// 转为小写
/// </summary>
/// <param name=”arg0″>参数</param>
/// <returns></returns>
public String LowercaseMethod(String arg0)
{
String result = String.Empty;
if (arg0 != null)
{
result = arg0.ToLower();
}
MessageBox.Show(“BindingTestAv8Handler : ” + result);
return result;
}
#endregion 方法
}
2.3 评价总结:
优势:
(1)、与方法一相比,这个的优势在于不需要在类内部(ExampleBv8Handler),写操作代码。因为有些操作必须在外面编写的,通过回调可以解决这个问题。
弊端:
(1)、弊端与方法一类似,很不灵活;
form:http://www.wuleba.com/23620.html
【转】第4篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:委托回调方法分析的更多相关文章
- 【转】第7篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:全自动注册与反射方法分析
作者: 牛A与牛C之间 时间: 2013-12-12 分类: 技术文章 | 2条评论 | 编辑文章 主页 » 技术文章 » 第7篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析
作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析
作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】3篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:官方原生方法分析
作者: 牛A与牛C之间 时间: 2013-11-17 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第3篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- Xilium.CefGlue怎么使用Js调用C#方法
第1篇:.NET多种WebKit内核/Blink内核浏览器初步测评报告http://www.wuleba.com/?p=23590 第2篇:Xilium CefGlue 关于 CLR Object 与 ...
- xilium CefGlue集成包
最近很苦B的要做一个C#的HTM5项目,build了一下xilium CefGlue包,提供下载地址,供那些无法下载的同学们使用. http://yun.baidu.com/s/1slEdNEt
- Xilium.CefGlue利用XHR实现Js调用c#方法
防外链 博客园原文地址在这里http://www.cnblogs.com/shen6041/p/3442499.html 引 Xilium CefGlue是个不错的cef扩展工程,托管地址在这里 ht ...
- CEF Xilium.CefGlue 在当前窗体中打开全部链接(防止弹窗)
我们在使用Xilium.CefGlue编写浏览器应用程序时.对于嵌入的网页假设有链接会在新窗体打开.这种用户体验会非常差.因此我们须要改动程序,使全部链接都在当前窗体中打开. 首先引用Xilium.C ...
- 一步步学习javascript基础篇(3):Object、Function等引用类型
我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...
随机推荐
- jqGrid详解及高级应用(十四)
一:jqGrid 是一个用来显示网格数据的jQuery插件,文档比较全面,附带中文版本. 二:官方主页http://www.jqgrid.com/目前最新版本:jqGrid 3.7 Beta在线文档 ...
- 在config文件输入特殊字符
今天遇到要在config文件中配置一个包含引号,尖括号的特殊字符的问题,config文件不支持转义字符,我开始发动自己的脑子想,想出一个蹩脚的方法,用其他的字符替换比如&,?,!,问题倒是解决 ...
- Windows 2008 R2防火墙,允许被ping
netsh firewall set icmpsetting 8 1. 准备 1) 原因 出于安全因素考虑,在Windows 2008 R2上是不允许从外部对其Ping ...
- iOS-appDelegate 生命周期
- (void)applicationWillResignActive:(UIApplication *)application 说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事 ...
- 第一个Sprint冲刺第六天
讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:解决编写代码的问题 讨论地点:宿舍 进展:已开始对代码的编写
- Ubuntu安装Sun JDK及如何设置默认java JDK
假设系统为Ubuntu 10.10 64位. 先来看看当前的系统默认的java版本,及提供商.通过命令java -version kemix@kemix-VB10-64:~$ jav ...
- TC Hash Filter
Overview The u32 filter allows you to match on any bit field within a packet, so it is in some ways ...
- Oracle执行语句跟踪(2)——使用10046事件实现语句追踪
接上篇博文Oracle执行语句跟踪(1)--使用sql trace实现语句追踪,一旦我们通过会话追踪获取到超时事物的执行语句,就可以使用10046事件对语句进行追踪. 启用10046事件追踪的方式 S ...
- 关于typedef的用法总结(转)
不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些 ...
- python with as用法
with as用途:取代原来的try...finally,主要是用于处理异常 基本语法:with EXPRESSION [ as VARIABLE] WITH-BLOCK 基本要求:with所求值的对 ...