How to fix 'CEF can only be initialized once per process'

By FoxLearn 7/10/2024 7:02:41 AM   29
The error message "CEF can only be initialized once per process" typically occurs when trying to initialize the Chromium Embedded Framework (CEF) more than once in the same process.

CEF can only be initialized once per process

Here are steps to troubleshoot and potentially fix this issue:

System.Exception: 'CEF can only be initialized once per process. This is a limitation of the underlying CEF/Chromium framework. You can change many (not all) settings at runtime through RequestContext.SetPreference. See https://github.com/cefsharp/CefSharp/wiki/General-Usage#request-context-browser-isolation Use Cef.IsInitialized to guard against this exception. If you are seeing this unexpectedly then you are likely calling Cef.Initialize after you've created an instance of ChromiumWebBrowser, it must be before the first instance is created.'

Review your code to ensure that the CEF initialization code is only executed once during the lifetime of your application process.

Ensure that CEF initialization and shutdown functions are called from the same thread context. CEF is not thread-safe for initialization and shutdown operations.

It's crucial to call Cef.Initialize(settings) before creating any instance of ChromiumWebBrowser() because creating the browser itself initializes CefSharp with default settings.

How to properly initialize CefSharp web browser

In your Form class, add the following code to initialize CefSharp:

using CefSharp;
using CefSharp.WinForms;

public partial class Form1 : Form
{
    private ChromiumWebBrowser chromeBrowser;

    public Form1()
    {
        InitializeComponent();

        // Initialize CefSharp
        CefSettings settings = new CefSettings();
        Cef.Initialize(settings);

        // Create a ChromiumWebBrowser instance
        chromeBrowser = new ChromiumWebBrowser("https://foxlearn.com");
        chromeBrowser.Dock = DockStyle.Fill;

        // Add the ChromiumWebBrowser to the Controls collection of the form
        this.Controls.Add(chromeBrowser);
    }

    // Don't forget to dispose of the browser when closing the form
    protected override void Form1_Closing(FormClosingEventArgs e)
    {
        Cef.Shutdown();
    }
}

By following these steps, you should be able to properly initialize and use the CefSharp web browser in your .NET application.