次の問題があります。簡単な Windows ランタイム コンポーネントを使用して、アプリケーションとWebView
. 私はドキュメントに従ってこれをやっています
これは、Windows ランタイム コンポーネントのコードです。
public delegate void NotifyAppHandler( string str );
[AllowForWeb]
public sealed class WebViewInjectionObject
{
public event NotifyAppHandler OnNotifyApp;
public void NotifyApp( string str )
{
OnNotifyApp?.Invoke( str );
}
}
OnNavigatedTo
メソッドでは、を初期化WebViewInjectionObject
し、イベントをサブスクライブしOnNotifyApp
ます。
webViewInjectionObject = new WebViewInjectionObject();
webViewInjectionObject.OnNotifyApp += WebViewInjectionObject_OnNotifyApp;
その後、私が呼び出すのNavigationStarting
イベントでWebView
AddWebAllowedObject
WebView
private void WebView_NavigationStarting( WebView sender, WebViewNavigationStartingEventArgs args ) {
sender.AddWebAllowedObject( "nativeObject", webViewInjectionObject );
}
次に WebView と対話するメソッドのコードはWebViewInjectionObject_OnNotifyApp
次のようになります。
if (somethingGood) {
await WebView.InvokeScriptAsync( successFunctionName, functionArguments );
}
これをデスクトップ (バージョン 1709、ビルド 16299.371) で実行すると、すべて正常に動作します。
これを携帯電話 (バージョン 1709 およびバージョン 1607) で実行すると、この例外が発生します。
アプリケーションは、別のスレッド用にマーシャリングされたインターフェースを呼び出しました。(HRESULT からの例外: 0x8001010E (RPC_E_WRONG_THREAD))
通常、このような問題は、dspatcher を使用して UI スレッドから呼び出しを行うことで解決されます。私はfollowigをやってみました
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
await WebView.InvokeScriptAsync( successFunctionName, functionArguments );
} );
しかし、これはより深い例外につながります
呼び出しチェーンが別の ASTA で開始されたか、別の ASTA を通過したため、ASTA への COM 呼び出しがブロックされました。この呼び出しパターンはデッドロックが発生しやすく、アパートメント呼び出し制御では許可されていません。ASTA (スレッド 3036) への COM 呼び出し (IID: {638BB2DB-451D-4661-B099-414F34FFB9F1}、メソッド インデックス: 6) は、呼び出しチェーンが別の ASTA (スレッド 5964) で開始または通過したため、ブロックされました。この呼び出しパターンはデッドロックが発生しやすく、アパートメント呼び出し制御では許可されていません。
その後、 を使用することを考えたので、SynchronizationContext
これにしました。のOnNavigatedTo
syncContext = SynchronizationContext.Current;
そして、WebViewInjectionObject_OnNotifyApp
syncContext.Post( async delegate
{
await WBTWebView.InvokeScriptAsync( successFunctionName, functionArguments );
}, null );
これは再び最初の例外につながります。
私は次に何をすべきか途方に暮れています。目標は、Windows ランタイム コンポーネントからスローされたイベントをキャッチし、デスクトップとモバイルの両方で機能する方法で をInvokeScriptAsync
呼び出すことです。WebView