分享

Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告

 TT_TYG 2015-03-24
第一种方法,官方原生方法分析

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

1.1 实现过程:

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

(2)、重写DemoRenderProcessHandler里的OnWebKitInitialized ( )事件(注意:官方下载的代码,就有这个XXX\CefGlue.Demo\Renderer\DemoRenderProcessHandler.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 { getset; }

        #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)、如果前台更新,或者类的属性、方法更新,将会产生繁杂的后续联动更新操作

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多