1

次の問題があります。簡単な 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イベントでWebViewAddWebAllowedObjectWebView

 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

4

0 に答える 0