Служба рабочего стола моста приложений для Edge не работает - PullRequest
0 голосов
/ 15 мая 2019

Я занимаюсь разработкой собственного обмена сообщениями между WebExtension в Edge и настольным приложением.Но связь с настольным приложением через desktopBridge не работает.В приведенном ниже коде показано окно сообщения Success, но не окно сообщения Test.

AppServiceResponse desktopBridgeResponse = await this.desktopBridgeConnection.SendMessageAsync(testValueSet);, в котором встречается исключение "Ссылка на объект не установлена ​​для экземпляра объекта".

// AppService.cs
public async void Run(IBackgroundTaskInstance taskInstance)
{
    if (appService.CallerPackageFamilyName == "Microsoft.MicrosoftEdge_8wekyb3d8bbwe") // App service connection from Edge
    {
        appServiceconnection = details.AppServiceConnection;
        appServiceconnection.RequestReceived += OnRequestReceived;

        try
        {
            // Make sure the DesktopApp.exe is in your AppX folder, if not rebuild the solution
            await Windows.ApplicationModel.FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
        }
        catch (Exception)
        {
            MessageDialog dialog = new MessageDialog("Rebuild the solution and make sure the DesktopApp.exe is in your AppX folder");
            await dialog.ShowAsync();
        }
    }
    else (appService.CallerPackageFamilyName == Windows.ApplicationModel.Package.Current.Id.FamilyName) // App service connection from desktopBridge App
    {
        desktopBridgeConnection = details.AppServiceConnection;
    }
}

private async void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
    try
    {
        AppServiceResponse desktopBridgeResponse = await this.desktopBridgeConnection.SendMessageAsync(testValueSet);
    }
    catch (Exception e)
    {
        var errorMessage = e.Message;
    }
}
// DesktopApp.cs
[STAThread]
static void Main()
{
    Thread appServiceThread = new Thread(new ThreadStart(InitializeAppServiceConnection));
    appServiceThread.Start();
    Application.Run();
}

static async void InitializeAppServiceConnection()
{
    connection = new AppServiceConnection();
    connection.AppServiceName = "example";
    connection.PackageFamilyName = Package.Current.Id.FamilyName;
    connection.RequestReceived += Connection_RequestReceived;

    AppServiceConnectionStatus status = await connection.OpenAsync();
    if (status != AppServiceConnectionStatus.Success)
    {
        // something went wrong ...
        MessageBox.Show(status.ToString());
    }
    else
    {
        MessageBox.Show("Success");
    }
}

private static void Connection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
    MessageBox.Show("Test");

    string key = args.Request.Message.First().Key;
    string value = args.Request.Message.First().Value.ToString();

}

Согласно Безопасный ввод он должен работать.

Почему не введен Connection_RequestReceived(), хотя соединение со службой приложения установлено успешно?

Любая помощь будет оценена, спасибо!

Обновление : с помощью отладки я обнаружил следующее: Когда служба приложений получает сообщение от Edge, Run() метод работает в «ветви пограничного соединения».Затем выполняется OnRequestReceived(), при котором сообщение отправляется на desktopBridge await this.desktopBridgeConnection.SendMessageAsync(testValueSet), но это не удается.Затем Run() выполняется снова и запускается в «ветку подключения DesktopBridge».На этом этапе определяется desktopBridgeConnection, но уже слишком поздно.

Мне нужно определить desktopBridgeConnection до ввода OnRequestReceived(), чтобы я мог использовать его в OnRequestReceived().Но я не знаю, как это реализовать.

...