Buka Menu: Project -> Manage NuGet Package
Ganti Target Net 4.5.2 keatas dan platform configuration (x86, x64 or AnyCPU)
Perbaiki file .csproj
Tambahkan sebelum tag </PropertyGroup>
<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>
Configuration Error
jika menemukan: Please check to make sure that you have specified a valid combination of Configuration and Platform for this project. Maka buka
Klik kanan Project > Properties > Build lalu cut pada bagian Output Path. Selanjutnya Build project lalu paste lagi di tempat semula. Selanjutnya silahkan coba rebuild lagi.
program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using System.IO;
namespace WindowsFormsApplication1
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Cef.EnableHighDPISupport();
var settings = new CefSettings()
{
//By default CefSharp will use an in-memory cache, you need to specify a Cache Folder to persist data
CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\\Cache")
};
//Example of setting a command line argument
//Enables WebRTC
settings.CefCommandLineArgs.Add("enable-media-stream");
//Perform dependency check to make sure all relevant resources are in our output directory.
Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public ChromiumWebBrowser chromeBrowser;
public Form1()
{
InitializeComponent();
InitializeChromium();
}
public void InitializeChromium()
{
// Create a browser component
//chromeBrowser = new ChromiumWebBrowser("http://admin:@192.168.43.10/video.cgi");
chromeBrowser = new ChromiumWebBrowser("http://localhost:8001/camera/mjpeg");
// Add it to the form and fill it to the form window.
panel1.Controls.Add(chromeBrowser);
chromeBrowser.Dock = DockStyle.Fill;
//Wait for the page to finish loading (all resources will have been loaded, rendering is likely still happening)
chromeBrowser.LoadingStateChanged += (sender, args) =>
{
//Wait for the Page to finish loading
Console.WriteLine("Loading State Changed GoBack {0} GoForward {1} CanReload {2} IsLoading {3}", args.CanGoBack, args.CanGoForward, args.CanReload, args.IsLoading);
if (args.CanReload && !args.IsLoading)
{
//chromeBrowser.Reload();
}
};
chromeBrowser.IsBrowserInitializedChanged += OnIsBrowserInitializedChanged;
//Wait for the MainFrame to finish loading
chromeBrowser.FrameLoadEnd += (sender, args) =>
{
//Wait for the MainFrame to finish loading
// if (args.Frame.IsMain)
{
Console.WriteLine("MainFrame finished loading Status code {0}", args.HttpStatusCode);
if (args.HttpStatusCode == 200)
{
//finished, OK, streaming end
chromeBrowser.Reload();
}
if (args.HttpStatusCode == -101)
{
//finished, OK, streaming shut down
chromeBrowser.Reload();
}
if (args.HttpStatusCode == 0)
{
//The client request wasn't successful.
chromeBrowser.Reload();
}
}
};
}
private void ChromeBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{
Console.WriteLine("end");
}
private void OnLoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
Console.WriteLine(chromeBrowser.IsLoading);
}
private void OnIsBrowserInitializedChanged(object sender, EventArgs e)
{
var b = ((ChromiumWebBrowser)sender);
this.InvokeOnUiThreadIfRequired(() => b.Focus());
}
private void button1_Click(object sender, EventArgs e)
{
string url = textBox1.Text;
if (Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute))
{
chromeBrowser.Load(url);
}
}
}
public static class ControlExtensions
{
/// <summary>
/// Executes the Action asynchronously on the UI thread, does not block execution on the calling thread.
/// </summary>
/// <param name="control">the control for which the update is required</param>
/// <param name="action">action to be performed on the control</param>
public static void InvokeOnUiThreadIfRequired(this Control control, Action action)
{
//If you are planning on using a similar function in your own code then please be sure to
//have a quick read over https://stackoverflow.com/questions/1874728/avoid-calling-invoke-when-the-control-is-disposed
//No action
if (control.Disposing || control.IsDisposed || !control.IsHandleCreated)
{
return;
}
if (control.InvokeRequired)
{
control.BeginInvoke(action);
}
else
{
action.Invoke();
}
}
}
}