public unsafe static void Main(string[] args) { //string cefPath = Path.Combine(Path.GetDirectoryName(GetProjectPath()), "cef", "Release"); string cefPath = "/home/vlad/work/cefnetdev/CefNetTest/bin/Debug/netcoreapp3.0"; var path = Environment.GetEnvironmentVariable("PATH"); Environment.SetEnvironmentVariable("PATH", cefPath + ";" + path); string libname = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "libcef.dll" : "libcef.so"; IntPtr pLibCef = NativeMethods.LoadLibrary(Path.Combine(cefPath, libname)); // This executable is called many times, because it // is also used for subprocesses. Let's print args // so we can differentiate between main process and // subprocesses. If one of the first args is for // example "--type=renderer" then it means that // this is a Renderer process. There may be more // subprocesses like GPU (--type=gpu-process) and // others. On Linux there are also special Zygote // processes. Console.Write("\nProcess args: "); if (args.Length == 0) { Console.Write("none (Main process)"); } else { Console.WriteLine(); for (int i = 0; i < args.Length; i++) { if (args[i].Length > 128) { Console.WriteLine(args[i].Remove(128) + "..."); } else { Console.WriteLine(args[i]); } } } Console.Write("\n\n"); // CEF version if (args.Length == 0) { var version = new int[8]; for (int i = 0; i < version.Length; i++) { version[i] = CefApi.CefVersionInfo((CefVersionEntry)i); } Console.Write("CEF version: {0}\n", string.Join(".", version)); } // Main args CefMainArgs main_args = CefMainArgs.CreateDefault(); // Main args //cef_main_args_t main_args = default; //main_args..instance = GetModuleHandle(null); // Cef app var cef_app = CefApp2.NewCefApp(); // Execute subprocesses. It is also possible to have // a separate executable for subprocesses by setting // cef_settings_t.browser_subprocess_path. In such // case cef_execute_process should not be called here. Console.Write("cef_execute_process, argc={0}\n", args.Length); int code = CefNativeApi.cef_execute_process((cef_main_args_t *)&main_args, cef_app, (void *)0); if (code >= 0) { Environment.Exit(code); } // Application settings. It is mandatory to set the // "size" member. var settings = new CefSettings(); //settings.MultiThreadedMessageLoop = true; settings.LocalesDirPath = Path.Combine(CefPath, "Resources", "locales"); settings.ResourcesDirPath = Path.Combine(CefPath, "Resources"); settings.LogSeverity = CefLogSeverity.Warning; // Show only warnings/errors settings.NoSandbox = true; // Initialize CEF Console.Write("cef_initialize\n"); CefNativeApi.cef_initialize((cef_main_args_t *)&main_args, settings.GetNativeInstance(), cef_app, (void *)0); GC.KeepAlive(settings); // Window info //cef_window_info_windows_t window_info = default; //window_info.style = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE; //window_info.parent_window = IntPtr.Zero; //window_info.x = CW_USEDEFAULT; //window_info.y = CW_USEDEFAULT; //window_info.width = CW_USEDEFAULT; //window_info.height = CW_USEDEFAULT; cef_window_info_linux_t window_info = default; // Window info - window title byte[] window_name = Encoding.ASCII.GetBytes("cefcapi example"); cef_string_t cef_window_name = default; fixed(byte *aWindowName = window_name) { CefNativeApi.cef_string_utf8_to_utf16(aWindowName, (UIntPtr)window_name.Length, (cef_string_utf16_t *)&cef_window_name); } window_info.window_name = cef_window_name; // Initial url byte[] url = Encoding.ASCII.GetBytes("https://www.google.com/ncr"); cef_string_t cef_url = default; fixed(byte *aUrl = url) { CefNativeApi.cef_string_utf8_to_utf16(aUrl, (UIntPtr)url.Length, (cef_string_utf16_t *)&cef_url); } // Browser settings. It is mandatory to set the // "size" member. var browser_settings = new CefBrowserSettings(); // Client handlers var client = new CefClientClass(); // Create browser asynchronously. There is also a // synchronous version of this function available. Console.WriteLine("cef_browser_host_create_browser\n"); CefNativeApi.cef_browser_host_create_browser((cef_window_info_t *)&window_info, client.GetNativeInstance(), &cef_url, browser_settings.GetNativeInstance(), default, default);