zoukankan      html  css  js  c++  java
  • 【转】3篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:官方原生方法分析

    作者:  时间: 2013-11-17 分类: 技术文章 | 暂无评论 | 编辑文章

    您的支持,是我前进的动力

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

    本文转自“吾乐吧软件站”,原文链接:http://www.wuleba.com/?p=23617

    感兴趣的,可以加入:WebKit/Blink 内核浏览器开发 QQ交流群:244840771

    开发语言为:.NET/C++ 方向

    1、第一种方法,官方原生方法分析

    1.1 实现过程:

    (1)、定义一个DemoRenderProcessHandler,继承自CefRenderProcessHandler

    (2)、重写DemoRenderProcessHandler里的OnWebKitInitialized ( )事件(注意:官方下载的代码,就有这个XXXCefGlue.DemoRendererDemoRenderProcessHandler.cs文件,不要自己去创建啊,因为涉及调用,为了省事,大家直接打开官方这个文件,进行修改即可)

    (3)、定义一个ExampleAv8Handler,继承自CefV8Handler

    (4)、在ExampleAv8Handler里的Execute ( )事件中,写你要执行的操作代码

    (5)、在OnWebKitInitialized ( )事件里面new ExampleAv8Handler ( ),根据类的实际情况,人工手写JS脚本代码,通过官方提供的RegisterExtension(string extensionName, string javascriptCode, CefV8Handler handler)方法进行注册

    (6)、写一个网页,去前台通过JS调用,例如网页那边调用:exampleA.myFunction ();

    1.2 核心代码:

    /// <summary>

    /// DemoRenderProcessHandler.cs

    /// </summary>

    #region 声明常量变量

    /// <summary>

    /// 绑定测试处理器A

    /// </summary>

    private ExampleAv8Handler exampleA;

    #endregion 声明常量变量

    protected override void OnWebKitInitialized()

    {

        #region 原生方式注册 ExampleA

        exampleA = new ExampleAv8Handler();

        const string exampleAJavascriptCode = @”function exampleA() {}

        if (!exampleA) exampleA = {};

        (function() {

            exampleA.__defineGetter__(‘myParam’,

            function() {

                native function GetMyParam();

                return GetMyParam();

            });

            exampleA.__defineSetter__(‘myParam’,

            function(arg0) {

                native function SetMyParam(arg0);

                SetMyParam(arg0);

            });

            exampleA.myFunction = function() {

                native function MyFunction();

                return MyFunction();

            };

            exampleA.getMyParam = function() {

                native function GetMyParam();

                return GetMyParam();

            };

            exampleA.setMyParam = function(arg0) {

                native function SetMyParam(arg0);

                SetMyParam(arg0);

            };

        })();”;

        CefRuntime.RegisterExtension(“exampleAExtensionName”, exampleAJavascriptCode, exampleA);

    #endregion 原生方式注册 ExampleA

        base.OnWebKitInitialized();

    }

    /// <summary>

    /// ExampleAv8Handler.cs

    /// </summary>

    public class ExampleAv8Handler : CefV8Handler

    {

        #region 声明常量变量

            /// <summary>

            /// 内容

            /// </summary>

            public string MyParam { get; set; }

            #endregion 声明常量变量

        #region 构造函数

        /// <summary>

        /// 默认构造函数

        /// </summary>

        public ExampleAv8Handler()

        {

            MyParam = “ExampleAv8Handlerler : flydoos@vip.qq.com”;

        }

        #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)

        {

            string result = string.Empty;

            switch (name)

            {

                case “MyFunction”:

                    MyFunction();

                    break;

                case “GetMyParam”:

                    result = GetMyParam();

                    break;

                case “SetMyParam”:

                    result = SetMyParam(arguments[0].GetStringValue());

                    break;

                default:

                    MessageBox.Show(string.Format(“JS调用C# >> {0} >> {1} 返回值”, name, obj.GetType()), “系统提示”, MessageBoxButtons.OK);

                    break;

            }

            returnValue = CefV8Value.CreateString(result);

            exception = null;

            return true;

        }

        #endregion 事件

        #region 方法

            /// <summary>

            /// 我的函数

            /// </summary>

            public void MyFunction()

            {

                MessageBox.Show(“ExampleAv8Handlerler : JS调用C# >> MyFunction >> 无 返回值”, “系统提示”, MessageBoxButtons.OK);

            }

            /// <summary>

            /// 取值

            /// </summary>

            /// <returns></returns>

            public string GetMyParam()

            {

                return MyParam;

            }

            /// <summary>

            /// 赋值

            /// </summary>

            /// <param name=”value”>值</param>

            /// <returns></returns>

            public string SetMyParam(string value)

            {

                MyParam = value;

                return MyParam;

            }

            #endregion 方法

    }

    1.3 评价总结:

    弊端:

    (1)、类对象必须继承CefV8Handler,所有操作方法,都必须写在该类Execute ( )里面

    (2)、类对象的所有属性、方法,都需要在后台写出对应的JS脚本,进行注册绑定

    (3)、如果想执行不同操作,就需要不断的写一大堆类对象,因为每个类只能做一件事

    (4)、如果前台更新,或者类的属性、方法更新,将会产生繁杂的后续联动更新操作

    from:http://www.wuleba.com/23617.html

  • 相关阅读:
    ElasticSearch2.3.1环境搭建哪些不为人知的坑
    don't run elasticsearch as root.
    翻译 Asp.Net Core 2.2.0-preview1已经发布
    微信小程序与AspNetCore SignalR聊天实例
    .Net Core扩展 SharpPlugs简单上手
    Docker折腾手记-linux下安装
    C#3.0 扩展方法
    微软微服务eShopOnContainers示例之EventBusRabbitMq解析与实践
    C#3.0智能的编译器
    C#3.0导航
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/5712380.html
Copyright © 2011-2022 走看看