博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CEF js调用C#封装类含注释
阅读量:5979 次
发布时间:2019-06-20

本文共 7812 字,大约阅读时间需要 26 分钟。

/* * CEF JS调用C#组装类 *  * 使用方法(CefGlue为例): *  public class BrowserRenderProcessHandler : CefRenderProcessHandler    { *      //自定义Handler        private TestBrowserHandler _testHandler = null; *  *      protected override void OnWebKitInitialized() *      {           *           _testHandler = new TestBrowserHandler(); *           CefRuntime.RegisterExtension(_testHandler.GetType().Name, _testHandler.Javascript.Create(), _testHandler); *      }  *  } *  *  ///     /// 测试Handler    ///     public class TestBrowserHandler : CefV8Handler    {        public GenerateJavascriptFull Javascript = null; *  *       public TestBrowserHandler()         {            Javascript = new GenerateJavascriptFull("plugins", "test"); *          // getHello的参数数量,可进一步封装。表示接受一个参数            Javascript.AddMethod("gethello", "arg0"); *          // getHello的参数数量,可进一步封装。表示接受二个参数            Javascript.AddMethod("sethello", "arg0","arg1"); *          //表示无参 *          Javascript.AddMethod("sethello");            Javascript.AddGetProperty("hello", "gethello");            Javascript.AddSetProperty("hello", "sethello", "arg0");            Javascript.AddMethod("start", "arg0");            Javascript.AddMethod("stop"); *  *          //这里表示浏览器JS增加了: window.plugins.test 对象 *          // window.plugins.test.gethello() *          // window.plugins.test.sethello("123") *          //断点在 Execute(**)中         } *  *   protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)        {            try            {                returnValue = CefV8Value.CreateNull();                switch (name)                {                    case "gethello":                        //returnValue = CefV8Value.CreateString(GetHello());                        if (arguments.Length == 1 && arguments[0].IsFunction)                        {                            CefV8Value[] args = new CefV8Value[1];                            args[0] = CefV8Value.CreateString(GetHello());                            returnValue = arguments[0].ExecuteFunction(null, args);                        }                        break;                    case "sethello":                        returnValue = CefV8Value.CreateBool(SetHello(arguments[0].GetStringValue()));                        break;                    case "start":                        if (arguments.Length == 1 && arguments[0].IsFunction)                        {                            CefV8Context context = CefV8Context.GetCurrentContext();                            //这里定义异步调用方式                            new Thread(new ThreadStart(delegate()                            {                                while (isStart)                                {                                    System.Threading.Thread.Sleep(1000);                                    string timer = DateTime.Now.ToString(); *                                  //TestTimerTask继承CefTask                                    CefRuntime.PostTask(CefThreadId.Renderer, new TestTimerTask(context as CefV8Context, arguments[0], new object[] { timer }));                                }                            })).Start();                            returnValue = CefV8Value.CreateBool(true);                        }                        break;                    case "stop":                        isStart = false;                        returnValue = CefV8Value.CreateBool(true);                        break;                                   }                exception = null;                return true;            }            catch (Exception e)            {                returnValue = null;                exception = e.Message;                return false;            }        } * } *  *  *  *  *  */using System;using System.Collections.Generic;using System.Text;namespace G.DeskCommon{    ///     /// 组装JS    ///     public class GenerateJavascriptFull    {        string _extensionName = string.Empty;        string _functionName = string.Empty;        Dictionary
_methodName = new Dictionary
(); // Dictionary
_getterPropertyName = new Dictionary
(); // 保存setter 名称 和参数。 与 _setterPropertyArgs 成对出现。 Dictionary
_setterPropertyName = new Dictionary
(); Dictionary
_setterPropertyArgs = new Dictionary
(); //自定义javascript代码 List
_customJavascript = new List
(); ///
/// /// ///
/// 插件方法作用域 /// e.g: window.plugin.test /// 其中 plugin 为作用域. 如不设置,添加的js方法在window下. /// ///
/// /// public GenerateJavascriptFull(string extensionName, string functionName) { _extensionName = extensionName; _functionName = functionName; } ///
/// 增加方法 /// ///
方法名称 ///
参数名:arg0,arg1,...arg20 (固定写死) public void AddMethod(string methodName, params string[] args) { //检测是否存在改方法 if (_methodName.ContainsKey(methodName)) return; _methodName.Add(methodName, args); } ///
/// 增加Getter属性 /// ///
属性名称 ///
执行名称,CEF handler中execute的Name参数同名 public void AddGetProperty(string propertyName, string executeName) { if (_getterPropertyName.ContainsKey(propertyName)) return; _getterPropertyName.Add(propertyName, executeName); } ///
/// 增加Setter属性 /// ///
属性名称 ///
执行名称,CEF handler中execute的Name参数同名 ///
参数名:arg0,arg1,...arg20 (固定写死) public void AddSetProperty(string propertyName, string executeName, params string[] args) { if (_setterPropertyName.ContainsKey(propertyName) || _setterPropertyArgs.ContainsKey(propertyName)) return; _setterPropertyName.Add(propertyName, executeName); _setterPropertyArgs.Add(propertyName, args); } ///
/// 增加自定义的javascript代码。 /// ///
注意:functionName一定要大写。 /// 例如: TEST.__defineSetter__('hello', function(b) { /// native function sethello();sethello(b);}); public void AddCustomJavascript(string javascriptCode) { _customJavascript.Add(javascriptCode); } ///
/// 组装本地JS的一个过程 /// ///
返回CEF识别的javascript
public string Create() { //System.Threading.Thread.Sleep(3000); if (string.IsNullOrEmpty(_functionName)) throw new Exception("JavascriptFull函数名不能为空!"); StringBuilder sb = new StringBuilder(); //头部 if (!string.IsNullOrEmpty(_extensionName)) { sb.Append(string.Format("if (!{0}) var {0} = { { }}; ", _extensionName)); } if (!string.IsNullOrEmpty(_functionName)) { sb.Append(string.Format("var {0} = function () { { }}; ", _functionName.ToUpper())); if (!string.IsNullOrEmpty(_extensionName)) sb.Append(string.Format("if (!{0}.{1}) {0}.{1} = {2};", _extensionName, _functionName, _functionName.ToUpper())); else sb.Append(string.Format("if (!{0}) var {0} = {1};", _functionName, _functionName.ToUpper())); } //开始 sb.Append("(function () { "); //方法 foreach (KeyValuePair
item in _methodName) { sb.Append(string.Format("{0}.{1} = function ({2}) { { ", _functionName.ToUpper(), item.Key, string.Join(",", item.Value))); sb.Append(string.Format("native function {0}({1}); return {0}({1});", item.Key, string.Join(",", item.Value))); sb.Append("};"); } //GET属性 foreach (KeyValuePair
item in _getterPropertyName) { sb.Append(string.Format("{0}.__defineGetter__('{1}', function () { { ", _functionName.ToUpper(), item.Key)); sb.Append(string.Format("native function {0}(); return {0}();", item.Value)); sb.Append("});"); } //SET属性 if (_setterPropertyArgs.Count == _setterPropertyName.Count) { foreach (KeyValuePair
item in _setterPropertyName) { sb.Append(string.Format("{0}.__defineSetter__('{1}', function ({2}) { { ", _functionName.ToUpper(), item.Key, string.Join(",", _setterPropertyArgs[item.Key]))); sb.Append(string.Format("native function {0}({1}); return {0}({1});", item.Value, string.Join(",", _setterPropertyArgs[item.Key]))); sb.Append("});"); } } //自定义javascript for (int i = 0; i < _customJavascript.Count; i++) { sb.Append(_customJavascript[i]); } //结尾 sb.Append("})();"); return sb.ToString(); } }}

 

转载地址:http://fraox.baihongyu.com/

你可能感兴趣的文章
纯数学教程 Page 203 例XLI (1)
查看>>
$M$的冪集的勢不大於$M$的所有排列形成的集合的勢
查看>>
有限偏序集必有最大元
查看>>
SQL中的Null深入研究分析
查看>>
12个国外优秀.Net开源项目(转)
查看>>
Expression Blend 4 激活
查看>>
将java项目转换成Web项目
查看>>
mysql 原理 ~ LRU 算法与buffer_pool
查看>>
个人经验~ 利用5.7的sys库更好的排查问题
查看>>
(转) ACM必备(学完一个就加亮一个)不多,就这些!
查看>>
数字图像处理中所用数学工具4---集合、逻辑操作与模糊集合
查看>>
java学习之租车系统
查看>>
C 标准库 中 操作 字符串 的 代码
查看>>
【杭电ACM】1004 Let the Balloon Rise
查看>>
2018年5月26日笔记
查看>>
arcgis裁剪失败
查看>>
《高性能MySQL》--复制笔记
查看>>
3.07 检测两个表中是否有相同的数据
查看>>
价值投资
查看>>
eclipse 使用Maven deploy命令部署构建到Nexus
查看>>