背景

"有没有遇见这样一个场景,需要注入到浏览器的类太多,又想统一管理且不遗漏,有没有什么好办法?"
”有有有,把头伸过来~“

解决办法

第一步:提供一个[Attribute]

既然要知道哪些类需要被浏览器,那么可以使用[Attribute]进行标记。

首先我们提供一个[Attribute],
第一个原因是 考虑到cefsharp是不支持同一个类名注入的,所以使用[Attribute]也能方便取名,以便于防止重名事情发生。

其次,如果不想要注入,可以直接移除[Attribute]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public sealed class JSBridgeAttribute : Attribute
{
/// <summary>
/// js中服务名称
/// </summary>
public string Name { get; set; }
/// <summary>
///
/// </summary>
public bool IsAsync { get; set; } = true; public JSBridgeAttribute()
{ } public JSBridgeAttribute(string name, bool isAsync = true)
{
this.Name = name;
this.IsAsync = isAsync;
}
}

有了这个,可以在你想要的class上进行标记,这样就表示,存在一个 FooService,可以调用里面的方法sum

[JSBridgeAttribute("FooService")]
public class Foo
{
public int sum(int x,int y)
{
return x + y;
}
}

第二步:在浏览器里面加入标记JSBridge类

因为要找到全部的标记JSBridge类,可以通过程序集反射得到,(考虑到这个过程耗时,要得到所有的类都加载完毕再打开浏览器,因此加上_initDll.Wait()

注意:存在某种情况找不到程序集,可能因为该程序集并没有在主程序中有过调用

/// <summary>
/// 扩展全局注入js
/// </summary>
public static class BrowserExtend
{
private static readonly List<Type> TypeCache = new List<Type>(); private static Task _initDll; /// <summary>
/// 初始化所有的DLL带JSBridgeAttribute的类
/// </summary>
public static Task InitDllTask()
{
_initDll = Task.Run(()=>
{
var list = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in list)
{
foreach (var type in GetTypesWithHelpAttribute(assembly))
{
TypeCache.Add(type);
}
}
}); return _initDll;
} public static void InjectBridgeObject(this BaseBrowser baseBrowser)
{
_initDll.Wait(); foreach (var type in TypeCache)
{
var item = Activator.CreateInstance(type);
var attribute = item.GetType().GetCustomAttributes(typeof(JSBridgeAttribute), false).FirstOrDefault() as JSBridgeAttribute;
string name = item.GetType().Name;
if (attribute != null)
{
name = attribute.Name;
}
baseBrowser.RegisterJsObject(name, item, true);
}
} private static IEnumerable<Type> GetTypesWithHelpAttribute(Assembly assembly)
{
foreach (Type type in assembly.GetTypes())
{
if (type.GetCustomAttributes(typeof(JSBridgeAttribute), true).Length > 0)
{
yield return type;
}
}
}
}

最后,在App.xaml.cs或者其他地方,使用 BrowserExtend.InitDllTask();

C# Cefsharp 如何利用[Attribute]的把C#中的方法给到浏览器中调用的更多相关文章

  1. C#利用Attribute实现简易AOP介绍

    首先看一段简单的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } //来自UI层的调用 ...

  2. C#当中利用Attribute实现简易AOP

    首先看一段简单的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } //来自UI层的调用 ...

  3. .Net core 2.0 利用Attribute获取MVC Action来生成菜单

    最近在学习.net core的同时将老师的MVC5项目中的模块搬过来用,其中有一块就是利用Attribute来生成菜单. 一·首先定义Action实体 /// <summary> /// ...

  4. 利用yum下载软件包的三种方法

    转自:http://297020555.blog.51cto.com/1396304/530703 方法一: downloadonly插件 有一个yum的插件叫做downloadonly,顾名思义,就 ...

  5. 利用navigator对象在浏览器中检查插件

    利用navigator对象在浏览器中检查插件,实现的代码如下. // IE4+.firefox.chrome.safari.opera中,利用navigator检测插件 ,name为插件的名字 fun ...

  6. 利用反射及JDBC元数据编写通用查询方法

    元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名... ResultSetMetaData可以通过ResultS ...

  7. 十九、利用OGNL获取ValueStack中:根栈和contextMap中的数据

    利用OGNL获取ValueStack中:根栈和contextMap中的数据 原则:OGNL表达式如果以#开头,访问的contextMap中的数据 如果不以#开头,是访问的根栈中的对象的属性(List集 ...

  8. 利用GBDT模型构造新特征具体方法

    利用GBDT模型构造新特征具体方法 数据挖掘入门与实战  公众号: datadw   实际问题中,可直接用于机器学**模型的特征往往并不多.能否从"混乱"的原始log中挖掘到有用的 ...

  9. C# 利用位运算传递多个参数方法

    前言 在工作中用sendMessage的方法向另外一个进程中传递窗体的位置,长度,宽度四个值,但是sendMessage的方法签名中只有两个参数.于是在网上找到了一些代码,找到了这个利用位运算来合并参 ...

  10. 利用Linux系统生成随机密码的10种方法【转】

    Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,并输出结 ...

随机推荐

  1. 项目管理--PMBOK 读书笔记(13)【项目相关方管理】

    1.相关方分矩阵 工具与技术 核查表 又叫检查表,计数表,收集属性数据,解决问题.   焦点小组&访谈: 特点:慢,焦点小组是一对多,访谈时多对多.   抽样统计&控制图: 控制图反应 ...

  2. 增补博客 第三篇 python 英文统计

    编写程序实现对特定英文文章(文本文件)的单词数和有效行数的统计,其中要求空行不计数: def count_words_and_lines(file_path): word_count = 0 line ...

  3. 设置profile启动配置 -Dspring.profiles.active=dev

  4. 洛谷 P4913 二叉树深度

    题目链接:二叉树深度 思路 存储二叉树的各个节点并递归搜索二叉树深度. 题解 #include <bits/stdc++.h> using namespace std; #define l ...

  5. Jemter代理服务器录制脚本,优化后形成性能测试场景

    在进行性能测试(压力.负载)等,先要有对应的测试场景,比如添加功能:要先登录成功,然后调用添加接口,输入添加的内容,才可以添加成功.那么可以通过Jemter代理服务器,设置代理,打开测试的网站,录制脚 ...

  6. 为ssh服务器添加2fa认证,一个python脚本全搞定

    服务器ssh如果被别人登陆就是一场灾难,所以我研究了ssh认证,我发现Google Authenticator PAM可以实现ssh的2fa认证,但是安装和配置比较麻烦.因此我用python实现了ss ...

  7. Redis的几种应用实战

    1.分布式锁: 实现:用set key value ex time nx指令实现,这个指令以及其参数是原子性的操作.释放锁用del key,释放之前先比较一下value是否与当前的value一样,原因 ...

  8. Nunjucks

    Nunjucks是什么东东?其实它是一个模板引擎. 那什么是模板引擎? 模板引擎就是基于模板配合数据构造出字符串输出的一个组件.比如下面的函数就是一个模板引擎: function examResult ...

  9. redis出现错误提示MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for......

    某天,redis出现了这样一个错误提示: MISCONF Redis is configured to save RDB snapshots, but is currently not able to ...

  10. react-devtools安装以及使用中的问题

    使用react框架开发的小伙伴肯定都想使用想vue-devtools开发工具一样,可以看见组件的状态,和当前组件里的props,data等等. 当然react也有一个开发者工具,现在废话少说,开始安装 ...