作者: 牛A与牛C之间 时间: 2013-11-18 分类: 技术文章 | 暂无评论 | 编辑文章

主页 » 技术文章 » 第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 交互类库封装报告:委托回调方法分析的更多相关文章

  1. 【转】第7篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:全自动注册与反射方法分析

    作者: 牛A与牛C之间 时间: 2013-12-12 分类: 技术文章 | 2条评论 | 编辑文章 主页 » 技术文章 » 第7篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  2. 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析

    作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  3. 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析

    作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  4. 【转】3篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:官方原生方法分析

    作者: 牛A与牛C之间 时间: 2013-11-17 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第3篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  5. Xilium.CefGlue怎么使用Js调用C#方法

    第1篇:.NET多种WebKit内核/Blink内核浏览器初步测评报告http://www.wuleba.com/?p=23590 第2篇:Xilium CefGlue 关于 CLR Object 与 ...

  6. xilium CefGlue集成包

    最近很苦B的要做一个C#的HTM5项目,build了一下xilium CefGlue包,提供下载地址,供那些无法下载的同学们使用. http://yun.baidu.com/s/1slEdNEt

  7. Xilium.CefGlue利用XHR实现Js调用c#方法

    防外链 博客园原文地址在这里http://www.cnblogs.com/shen6041/p/3442499.html 引 Xilium CefGlue是个不错的cef扩展工程,托管地址在这里 ht ...

  8. CEF Xilium.CefGlue 在当前窗体中打开全部链接(防止弹窗)

    我们在使用Xilium.CefGlue编写浏览器应用程序时.对于嵌入的网页假设有链接会在新窗体打开.这种用户体验会非常差.因此我们须要改动程序,使全部链接都在当前窗体中打开. 首先引用Xilium.C ...

  9. 一步步学习javascript基础篇(3):Object、Function等引用类型

    我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...

随机推荐

  1. grunt 执行

    几天以前,我决定开始启用一个CSS预处理器,找了很久,我选择了SASS并且尝试着去安装它.但是这似乎不是一件简单的事,在安装过程中出现了许多让我始料不及的问题,我很沮丧,但查找了很多资料,我终于找到了 ...

  2. Object-C 基础笔记2--方法

    一,了解继承 oc中,一个类可以继承另一个类,被继承的类称为父类或超类,继承的类称为子类,子类可以直接拥有父类中除了@private实例变量之外的全部内容. 实现继承使用":" @ ...

  3. Candy Distribution_找规律

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6012   Accepted: 3341 Description N chi ...

  4. linux的ftp使用方法

    linux下常用FTP命令 1. 连接ftp服务器 以下是在服务器为Ubuntu环境下操作: (1)首先需要安装vsftp软件,已经安装的可跳过. 1.更新软件源 #apt-get  update 2 ...

  5. bold, big, blink

  6. ci(转)

    1  从代码管理器签出源文件 2  修改代码 3  编译代码 4  遇到错误,转到2继续修改直到达到预期 5  运行单元测试,期望所有的测试绿色(通过) 6  单元测试出错,转入2 7  重构代码,按 ...

  7. mark资料-selenium断言的分类

    操作(action).辅助(accessors)和断言(assertion): 操作action: 模拟用户与 Web 应用程序的交互. 辅助accessors: 这是辅助工具.用于检查应用程序的状态 ...

  8. 跟开涛老师学shiro -- shiro简介

    1.1  简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Securi ...

  9. Yii2中自带分页类实现分页

    1.首先写控制器层 先引用pagination类 use yii\data\Pagination; 写自己的方法: function actionFenye(){        $data = Fie ...

  10. Cortana 在安装语言包后失灵 | 解决

    http://windows.microsoft.com/zh-cn/windows-10/cortanas-regions-and-languages 适用于 Windows 10 Currentl ...