Hey team,
I recently stumbled upon this pretty nasty gotcha when trying to host our browser control inside a plugin system that loads a new AppDomains per plugin. When the native libcef.dll makes a call back into managed there is an exception thrown "Cannot pass a GCHandle across AppDomains".
I found that there have been several post written about this problem-
http://lambert.geek.nz/2007/05/29/unmanaged-appdomain-callback/
http://www.lenholgate.com/blog/2009/07/error-cannot-pass-a-gchandle-across-appdomains.html
Highlight from these posts-
"Consequently, when calling managed code from unmanaged code, the compiler has to pick one AppDomain to use, and it appears to pick the first one."
To test this issue
- Create a new WPF application
- Change App.xaml Build Action to Page (right-click Properties->Build Action->Page)
- Add file below with main - Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CefSharp;
namespace MultipleAppDomains
{
class Startup
{
[STAThread()]
static void Main()
{
AppDomain domain = AppDomain.CreateDomain("another domain");
CrossAppDomainDelegate action = () =>
{
var settings = new CefSettings
{
RemoteDebuggingPort = 8088,
BrowserSubprocessPath = "CefSharp.BrowserSubprocess.exe",
LogSeverity = LogSeverity.Verbose
};
if (!Cef.Initialize(settings))
{
// Do Something
}
App app = new App();
app.MainWindow = new MainWindow();
app.MainWindow.Show();
app.Run();
};
domain.DoCallBack(action);
}
}
}
I'd like to get the discussion going and come up with a good course of action.
Hey team,
I recently stumbled upon this pretty nasty gotcha when trying to host our browser control inside a plugin system that loads a new AppDomains per plugin. When the native libcef.dll makes a call back into managed there is an exception thrown "Cannot pass a GCHandle across AppDomains".
I found that there have been several post written about this problem-
http://lambert.geek.nz/2007/05/29/unmanaged-appdomain-callback/
http://www.lenholgate.com/blog/2009/07/error-cannot-pass-a-gchandle-across-appdomains.html
Highlight from these posts-
"Consequently, when calling managed code from unmanaged code, the compiler has to pick one AppDomain to use, and it appears to pick the first one."
To test this issue
I'd like to get the discussion going and come up with a good course of action.