2016-05-27 3 views
0

Я пытаюсь оценить, будет ли CefSharp работать для нас в приложении XAML/WPF.Необработанное исключение при выходе

В настоящее время мы работаем с веб-браузером MS, который имеет серьезные ограничения.

В нашем приложении есть окно, в котором отображается один из нескольких пользовательских элементов управления, один из которых содержит элемент управления браузера, который загружает веб-страницу, содержащую карту.

Для тестирования я создал настраиваемый элемент управления, который содержит WebBrowser с жестким кодом http://www.google.com.

Затем я создал второй настраиваемый элемент управления, который содержит ChromiumWebBrowser, жестко закодированный до http://www.google.com.

Я ничего не делаю с управлением браузером в коде, я просто делаю пользовательские элементы управления, которые обертывают их видимыми или свернутыми.

Но если у меня есть ChromiumWebBrowser включены в XAML, сделать ли я его видимым или нет, на выходе я получаю исключение:

System.InvalidOperationException was unhandled 
Message: An unhandled exception of type 'System.InvalidOperationException' occurred in WindowsBase.dll 
Additional information: The calling thread cannot access this object because a different thread owns it. 

Просто, чтобы было ясно, если мой пользовательский элемент управления содержит это, Я не получаю исключение:

<KtWpf:KorUserControl 
     x:Class="KtWpf.CEFSharpUtilityMap" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:KtWpf="clr-namespace:KtWpf" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" 
     > 
    <DockPanel> 
     <TextBox DockPanel.Dock="Top">CEFSharp</TextBox> 
     <WebBrowser 
       x:Name="mapBrowser" 
       Source="http://www.google.com" 
       /> 
    </DockPanel> 
</KtWpf:KorUserControl> 

Если он содержит это, я:

<KtWpf:KorUserControl 
     x:Class="KtWpf.CEFSharpUtilityMap" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf" 
     xmlns:KtWpf="clr-namespace:KtWpf" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" 
     > 
    <DockPanel> 
     <TextBox DockPanel.Dock="Top">CEFSharp</TextBox> 
     <cefSharp:ChromiumWebBrowser 
       x:Name="mapBrowser" 
       Address="http://www.google.com" 
      /> 
    </DockPanel> 
</KtWpf:KorUserControl> 

Какие идеи?

Я использую версию CefSharp.Wfp 49.0.0, начиная с NuGet. (И CefSharp.Common и cef.redist.x64, хотя я получаю то же самое, здание для x86.)

=== Добавление CallStack ===

> WindowsBase.dll!System.Windows.Threading.Dispatcher.VerifyAccess() Unknown 
PresentationCore.dll!MS.Internal.Media.VisualTreeUtils.AsVisual(System.Windows.DependencyObject element, out System.Windows.Media.Visual visual, out System.Windows.Media.Media3D.Visual3D visual3D) Unknown 
PresentationCore.dll!MS.Internal.Media.VisualTreeUtils.AsNonNullVisual(System.Windows.DependencyObject element, out System.Windows.Media.Visual visual, out System.Windows.Media.Media3D.Visual3D visual3D) Unknown 
PresentationCore.dll!System.Windows.Media.VisualTreeHelper.GetParent(System.Windows.DependencyObject reference) Unknown 
PresentationCore.dll!System.Windows.Media.Visual.ClearTreeBits(System.Windows.DependencyObject e, System.Windows.Media.VisualFlags treeFlag, System.Windows.Media.VisualFlags nodeFlag) Unknown 
PresentationCore.dll!System.Windows.Media.Visual.VisualAncestorChanged.remove(System.Windows.Media.Visual.AncestorChangedEventHandler value) Unknown 
PresentationCore.dll!System.Windows.PresentationSource.RemoveSourceChangedHandler(System.Windows.IInputElement e, System.Windows.SourceChangedEventHandler handler) Unknown 
CefSharp.Wpf.dll!CefSharp.Wpf.ChromiumWebBrowser.Dispose(bool isdisposing) Unknown 
CefSharp.Wpf.dll!CefSharp.Wpf.ChromiumWebBrowser.Dispose() Unknown 
CefSharp.Core.dll!CefSharp.Cef.Shutdown() Unknown 
CefSharp.Core.dll!CefSharp.Cef.ParentProcessExitHandler(object sender, System.EventArgs e) Unknown 
+0

У вас есть полный трассировки стека? – stuartd

+0

Есть ли причина, по которой вы спросили об этом здесь? – amaitland

+1

Я изначально разместил этот вопрос в группе Google CEFSharp и не получил ответа. Прочитав другие вопросы, меня направили в толк, и повторили его там. Я не мог понять, что невозможно. Учитывая, что это формат чата, я даже не мог сказать, ответил ли мне кто-нибудь. Поэтому я перепробовал вопрос здесь, где любые предоставленные ответы не будут потеряны для потомков. –

ответ

0

Что нам нужно сделать, это принять управление инициализацией и выключением.

В App.OnStartup():

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 
    Cef.Initialize(); 
    ... 
} 

в App.OnExit():

protected override void OnExit(ExitEventArgs e) 
{ 
    Cef.Shutdown(); 
    base.OnExit(e); 
}