背景

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

解决办法

第一步:提供一个[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. 在 Wed 中应用 MyBatis(同时使用MVC架构模式,以及ThreadLocal 事务控制)

    1. 在 Wed 中应用 MyBatis(同时使用MVC架构模式,以及ThreadLocal 事务控制) @ 目录 1. 在 Wed 中应用 MyBatis(同时使用MVC架构模式,以及ThreadL ...

  2. Css var 的基础使用

    Css var 语法 var(custom-property-name, value) - custom-property-name 必须 变量必须以 --开头 后面可以是英文.数字连接符,区分大小写 ...

  3. boltdb 原理

    简介 介绍及简单使用:https://www.cnblogs.com/daemon365/p/17690167.html 源码地址:https://github.com/etcd-io/bbolt p ...

  4. 可以把 FolkMQ 内嵌到 SpringBoot3 项目里(可内嵌的消息中间件,纯血国产)

    之前发了<把 FolkMQ 内嵌到 SpringBoot2 项目里(比如 "诺依" 啊)>.有人说都淘态了,有什么好内嵌的...所以再发个 SpringBoot3 Fo ...

  5. 实训day2

    HTML基本介绍 编辑网页的语言,超文本标记语言,是迄今为止网络上应用最为广泛的语言,也是抱成网页文档的主要语言.HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字.图形.动画.声 ...

  6. Canavs在文字上绘制删除线/中划线

    效果图: 思路: 绘制文字 绘制高度为1px的长方形,并用黑色填充 长方形的宽度为文字的长度 具体代码: let canvas = document.getElementById('canvas'); ...

  7. 面试官:Java类是如何被加载到内存中的?

    面试连环call Java类是如何被加载到内存中的? Java类的生命周期都有哪些阶段? JVM加载的class文件都有哪些来源? JVM在加载class文件时,何时判断class文件的格式是否符合要 ...

  8. 分布式事务的概念和解决方案Seate

    引入分布式事务: 在电商系统中,扣减库存与保存订单是在两个服务中存在的,如果扣减库存后订单保存失败了是不会回滚的,这样就会造成数据不一致的情况,这其实就是我们所说的分布式事务的问题,接下来我们来学习分 ...

  9. VirtualBox中Ubuntu 22.04 Server支持kvm

    kvm简介 KVM 是 Kernel-based Virtual Machine 的缩写,是一种用于虚拟化的开源硬件虚拟化技术. 使用 Linux 内核的虚拟化模块,将物理服务器划分为多个虚拟机. K ...

  10. 基于Docker安装项目管理工具禅道

    禅道是通用的项目管理软件 完整支持敏捷项目模型.瀑布项目模型.看板模型 内置项目集.产品.项目和执行四个管理框架 支持CMMI标准的落地实施 下载镜像 docker pull easysoft/zen ...