2016-05-27 31 views
0

Ich versuche zu bewerten, ob CefSharp für uns in einer XAML/WPF-Anwendung funktionieren würde.Unbehandelte Ausnahme beim Beenden

Derzeit arbeiten wir mit dem WebBrowser von MS, der schwerwiegende Einschränkungen aufweist.

In unserer App befindet sich ein Fenster, in dem eines von mehreren benutzerdefinierten Steuerelementen angezeigt wird, von denen eines ein Browsersteuerelement enthält, mit dem eine Webseite mit einer Karte geladen wird.

Zum Testen habe ich ein benutzerdefiniertes Steuerelement erstellt, das einen WebBrowser enthält, der fest mit http://www.google.com codiert ist.

Ich erstellte dann ein zweites benutzerdefiniertes Steuerelement, das einen fest codierten ChromiumWebBrowser zu http://www.google.com enthält.

Ich mache nichts mit beiden Browser-Steuerelement in Code, ich mache einfach die Benutzersteuerelemente, die sie sichtbar oder ausgeblendet umbrechen.

Aber wenn ich die ChromiumWebBrowser im XAML enthalten, ob ich es sichtbar machen oder nicht, an der Ausfahrt erhalte ich eine Ausnahme:

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. 

Nur um klarzustellen, wenn meine benutzerdefinierte Steuerung dieses enthält, ich habe nicht eine Ausnahme erhalten:

<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> 

Wenn es diese enthält, das tue ich:

<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> 

A ny Ideen?

Ich benutze CefSharp.Wfp Version 49.0.0, von NuGet. (Und CefSharp.Common und cef.redist.x64, obwohl ich das gleiche Gebäude für x86 erhalten.)

=== Hinzufügen Aufrufliste ===

> 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

Haben Sie einen vollständigen Stack-Trace haben? – stuartd

+0

Gibt es einen Grund, warum du das hier nochmal gefragt hast? – amaitland

+1

Ich habe diese Frage ursprünglich in der CEFSharp Google-Gruppe gepostet und keine Antwort erhalten. Während ich die anderen Fragen durchging, wurde ich an Gitter verwiesen und wiederholte es dort. Ich fand gitter unmöglich zu lesen. Angesichts seines Chat-Formats konnte ich nicht einmal sagen, ob jemand auf mich geantwortet hatte. Deshalb habe ich die Frage hier noch einmal gestellt, wo alle Antworten nicht der Nachwelt verloren gehen. –

Antwort

0

Was wir tun müssen, ist zu nehmen Kontrolle der Initialisierung und des Herunterfahrens

In App.OnStartup():

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

in App.OnExit():

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