C# Cefsharp 如何利用[Attribute]的把C#中的方法给到浏览器中调用
背景
"有没有遇见这样一个场景,需要注入到浏览器的类太多,又想统一管理且不遗漏,有没有什么好办法?"
”有有有,把头伸过来~“

解决办法
第一步:提供一个[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#中的方法给到浏览器中调用的更多相关文章
- C#利用Attribute实现简易AOP介绍
首先看一段简单的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } //来自UI层的调用 ...
- C#当中利用Attribute实现简易AOP
首先看一段简单的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } //来自UI层的调用 ...
- .Net core 2.0 利用Attribute获取MVC Action来生成菜单
最近在学习.net core的同时将老师的MVC5项目中的模块搬过来用,其中有一块就是利用Attribute来生成菜单. 一·首先定义Action实体 /// <summary> /// ...
- 利用yum下载软件包的三种方法
转自:http://297020555.blog.51cto.com/1396304/530703 方法一: downloadonly插件 有一个yum的插件叫做downloadonly,顾名思义,就 ...
- 利用navigator对象在浏览器中检查插件
利用navigator对象在浏览器中检查插件,实现的代码如下. // IE4+.firefox.chrome.safari.opera中,利用navigator检测插件 ,name为插件的名字 fun ...
- 利用反射及JDBC元数据编写通用查询方法
元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名... ResultSetMetaData可以通过ResultS ...
- 十九、利用OGNL获取ValueStack中:根栈和contextMap中的数据
利用OGNL获取ValueStack中:根栈和contextMap中的数据 原则:OGNL表达式如果以#开头,访问的contextMap中的数据 如果不以#开头,是访问的根栈中的对象的属性(List集 ...
- 利用GBDT模型构造新特征具体方法
利用GBDT模型构造新特征具体方法 数据挖掘入门与实战 公众号: datadw 实际问题中,可直接用于机器学**模型的特征往往并不多.能否从"混乱"的原始log中挖掘到有用的 ...
- C# 利用位运算传递多个参数方法
前言 在工作中用sendMessage的方法向另外一个进程中传递窗体的位置,长度,宽度四个值,但是sendMessage的方法签名中只有两个参数.于是在网上找到了一些代码,找到了这个利用位运算来合并参 ...
- 利用Linux系统生成随机密码的10种方法【转】
Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,并输出结 ...
随机推荐
- Python3.7+Robot Framework+RIDE1.7.4.1安装使用教程
一.解惑:Robot Framewprk今天我们聊一聊,Robot Framework被众多测试工程师误会多年的秘密.今天我们一起来揭秘一下,最近经常在各大群里听到许多同行,在拿Robot Frame ...
- axios 下载文件流
axios 下载文件流 背景:在处理文件下载时,服务端存在校验,需要在请求头里添加token 这时直接使用 a 标签就不能满足需求.接下来我们直接通过 axios 请求,在请求头里设置 token 请 ...
- Java8 多线程及并行计算demo
Java8 多线程及并行计算demo #接口 public interface RemoteLoader { String load(); default void delay() { try { T ...
- python重拾第十二天-MYSQL数据库
本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql 1. 数据库介 ...
- Qt 之 emit、signals、slot的使用
背景 ref : https://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html 信号和槽机制是 QT ...
- 3568F-视频开发案例
- 从Java开发者到.NET Core初级工程师学习路线:C#语言基础
1. C#语言基础 1.1 C#语法概览 欢迎来到C#的世界!对于刚从Java转过来的开发者来说,你会发现C#和Java有很多相似之处,但C#也有其独特的魅力和强大之处.让我们一起来探索C#的基本语法 ...
- SpringBoot获取指定Resource下的文件内容
加入依赖 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</a ...
- Spring5.X bean自动装配Autowire属性
属性注入 set方法.构造函数.POJO.list.map.ref,属于手工注入,点我直达 Spring自动注入 使用<bean>元素的autowire属性为一个bean定义指定自动装配模 ...
- 记一次centos7.9崩溃恢复操作(limits.conf配置失误),救援模式
引起故障的原因:调整了操作系统的内核参数文件limits.conf,* soft nproc 131072 * hard nproc 131072 * soft nofile 65536 * ...