Я занимаюсь разработкой собственного обмена сообщениями между 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()
.Но я не знаю, как это реализовать.