cefsharp 使用示例代码

.net 4.8,vs2022,cefsharp122.1.120,2024年3月16日。

记录cefsarp的winform使用具体示例:

在Main入口点先加载初始化,初始化类 CefSettingClass 后面建立:

internal static class Program
{
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main()
    {
        AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
        CefSettingClass.InitializeCefSetting();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new netkapper());
    }
    //解析程序集失败,会加载对应的程序集
    private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
    {
        Assembly executingAssembly = Assembly.GetExecutingAssembly();
        AssemblyName assemblyName = new AssemblyName(args.Name);

        var assemblyAllName = assemblyName.Name + ".dll";
        //加载CefSharp相关库
        if (args.Name.StartsWith("CefSharp"))
        {
            string assemblyPath = Path.Combine(Application.StartupPath, CefSettingClass.CefLibName, assemblyAllName);
            return File.Exists(assemblyPath) ? Assembly.LoadFile(assemblyPath) : null;
        }
        //判断程序集的区域性
        if (!assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture))
        {
            assemblyAllName = string.Format(@"{0}\{1}", assemblyName.CultureInfo, assemblyAllName);
        }
        using (Stream stream = executingAssembly.GetManifestResourceStream(assemblyAllName))
        {
            if (stream == null) return null;
            var assemblyRawBytes = new byte[stream.Length];
            stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
            return Assembly.Load(assemblyRawBytes);
        }
    }
}

建立 CefSettingClass 初始化类,初始化中修改了cefsharp的库文件目录为单一目录,这样比较简洁,只需要修改 library 目录名称即可:

 class CefSettingClass
 {
     public const string CefLibName = "library"; //cef目录名称

     /// <summary>
     /// 初始化CEF的配置
     /// </summary>
     public static void InitializeCefSetting()
     {
         //这段代码一定要在new ChromiumWebBrowser之前调用
         //作用是初始化浏览器的语言
         string appPath = Application.StartupPath;
         CefSettings settings = new CefSettings
         {
             //设置中文
             Locale = "zh-CN",
             //设置浏览器的访问头
             UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
             //设置浏览器子程序启动路径
             BrowserSubprocessPath = Path.Combine(appPath, CefLibName, "CefSharp.BrowserSubprocess.exe"),   
         };
         //全局浏览器缓存的数据将存储在磁盘上的位置
         settings.CachePath = Path.Combine(appPath, "cache");
         //调试日志的目录和文件名。如果为空,则使用默认名称“debug.log”
         settings.LogFile = Path.Combine(appPath, @"log\debug.log");
         //禁用 USB 键盘检测 虚拟键盘
         settings.CefCommandLineArgs.Add("disable-usb-keyboard-detect", "1");
         //启用视频调谐
         settings.CefCommandLineArgs.Add("enable-media-stream", "1");
         //启用触屏事件
         settings.CefCommandLineArgs.Add("touch-events", "1");
         //禁用代理服务器
         settings.CefCommandLineArgs.Add("no-proxy-server", "1");
         //禁用浏览器使用自动代理检测
         settings.CefCommandLineArgs.Add("proxy-auto-detect", "0");
         //忽略显卡黑名单
         settings.CefCommandLineArgs.Add("ignore-gpu-blacklist", "1");
         //跨域设置
         settings.CefCommandLineArgs.Add("--disable-web-security", "1");
         //禁用硬件加速GPU
         settings.CefCommandLineArgs.Add("disable-gpu", "1");
         //禁用屏外渲染最佳性能
         settings.SetOffScreenRenderingBestPerformanceArgs();
         //让浏览器的消息循环在一个单独的线程中执行
         settings.MultiThreadedMessageLoop = true;
         //忽略 URL 获取器证书请求
         settings.CefCommandLineArgs.Add("--ignore-urlfetcher-cert-requests", "1");
         //忽略证书错误
         settings.CefCommandLineArgs.Add("--ignore-certificate-errors", "1");
         //允许不安全的本地主机
         settings.CefCommandLineArgs.Add("allow-insecure-localhost", "1");
         //设置浏览器可使用的最大内存值为1GB(1024)
         settings.CefCommandLineArgs.Add("--js-flags", $"--max_old_space_size=1024");
         //禁用渲染器中的局部光栅
         settings.CefCommandLineArgs.Add("--disable-partial-raster", "1");
         //当使用CPU光栅化时,禁用低分辨率平铺
         settings.CefCommandLineArgs.Add("disable-low-res-tiling", "1");
         //禁用GPU合成?
         //setting.CefCommandLineArgs.Add("disable-gpu-compositing", "1");
         //强制设置设备的缩放因子
         settings.CefCommandLineArgs.Add("force-device-scale-factor", "1");
         //远程调试 URL
         settings.CefCommandLineArgs.Add("remote-debugging-port", "0");
         //未知
         settings.CefCommandLineArgs.Add("disable-features", "BlockInsecurePrivateNetworkRequests");
         Cef.Initialize(settings);
     }
     /// <summary>
     /// 注册方法,给javascript调用
     /// </summary>
     /// <param name="browser"></param>
     public static void JavascriptObjectRepository(ref ChromiumWebBrowser browser)
     {
         CefSharpSettings.WcfEnabled = true;
         browser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
         browser.JavascriptObjectRepository.Register("boundAsync", new BoundObject(), true, BindingOptions.DefaultBinder);
     }

 }

再到WindowsFormsApp1类里面写加载ChromiumWebBrowser的代码:

public partial class netkapper : Form
{

    private ChromiumWebBrowser browser;
    public netkapper()
    {
        browser = new ChromiumWebBrowser() { Dock = DockStyle.Fill };
        CefSettingClass.JavascriptObjectRepository(ref browser);
        this.Controls.Add(browser);
        this.FormClosing += OnClosing;
        browser.Load(@"d:\html\index.html");
        InitializeComponent();
    }
    /// <summary>
    /// 窗口关闭事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void OnClosing(object sender, CancelEventArgs e)
    {
        browser.GetBrowser().CloseBrowser(true);
    }

}
/// <summary>
/// 注册的方法,方便javascript调用
/// </summary>
public class BoundObject
{
    public int Add(string a)
    {
        MessageBox.Show("a" + a);
        return 1;
    }
}

下面是js调用c#方法的示例代码,由于上面是用的旧方法进行注册,所以这里不需要在js代码里面进行c#暴露接口绑定,直接调用即可。调用方法后获取返回值,这里返回的是 Promise 对象,所以支持then,catch来进行处理。

boundAsync.add("javascrip")
            .then(function(a){
                alert(a)
            })
            .catch(function(err){
                alert(err)
            })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿古斯巴鲁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值