Приложение UWP Desktop Bridge падает при двойном щелчке - PullRequest
0 голосов
/ 30 мая 2019

Я работаю над приложением UWP Desktop Bridge. Я создал проект упаковки и создал пакет приложения для боковой загрузки. Когда я нажимаю на приложение Значок один раз, приложение успешно запускается. Но при двойном щелчке значка приложение вылетает.

Я создал проект упаковки по ссылке: https://docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-packaging-dot-net Приложение работает нормально одним нажатием на иконку приложения. Это потому, что при двойном щелчке .exe вызывается дважды, и это является причиной сбоя?

Вот основной метод фонового процесса

   private static void Main(string[] args)
    {
        try
        {
            connection.AppServiceName = "CommunicationService";
            connection.PackageFamilyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;

            // hook up the connection event handlers
            connection.ServiceClosed += Connection_ServiceClosed;
            connection.RequestReceived += Connection_RequestReceived;

            AppServiceConnectionStatus result = AppServiceConnectionStatus.Unknown;


            // static void Main cannot be async until C# 7.1, so put this on the thread pool
            Task.Run(async () =>
            {
                // open a connection to the UWP AppService
                result = await connection.OpenAsync();

            }).GetAwaiter().GetResult();

            if (result == AppServiceConnectionStatus.Success)
            {
                while (true)
                {

                }
            }
        }
        catch (Exception)
        {
        }
    }

Код для звонка:

    private async Task StartBackgroundProcess()
    {
        try
        {
            // Make sure the BackgroundProcess 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 BackgroundProcess is in your AppX folder");
            await dialog.ShowAsync();
        }
    }

Также внутри манифеста пакета:

<desktop:Extension Category="windows.fullTrustProcess" Executable="BackgroundProcess.exe" />
    <uap:Extension Category="windows.appService">
      <uap:AppService Name="CommunicationService" />
    </uap:Extension>

и

<rescap:Capability Name="runFullTrust" />

Можно ли избежать проблемы сбоя?

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Пожалуйста, проверьте Пример моста AppService . Каждый раз он создает и запускает отдельный поток, чтобы создать новый экземпляр AppServiceConnection и вызвать его метод OpenAsync.

static void Main(string[] args)
{
    Thread appServiceThread = new Thread(new ThreadStart(ThreadProc));
    appServiceThread.Start();
}

static async void ThreadProc()
{
    connection = new AppServiceConnection();
    connection.AppServiceName = "CommunicationService";
    connection.PackageFamilyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;
    connection.RequestReceived += Connection_RequestReceived;
    AppServiceConnectionStatus status = await connection.OpenAsync();
}
0 голосов
/ 30 мая 2019

если это соединение, если вы попытаетесь подключить его дважды, оно может быть прервано. вы можете сделать так, чтобы приложение запускалось только один раз, если оно запущено, а затем переключитесь на запущенный процесс.

public partial class App : Application
   {
       /// <summary>
       /// Application Entry Point.
       /// </summary>
       static Mutex muetx = new Mutex(true, "{666666666}");

       [System.STAThreadAttribute()]
       [System.Diagnostics.DebuggerNonUserCodeAttribute()]
       [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
       public static void Main()
       {
           if (muetx.WaitOne(TimeSpan.Zero, true))
           {
               TestBeginInvoke.App app = new TestBeginInvoke.App();
               app.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
               app.Run();
           }
           else
           {
               var pro = System.Diagnostics.Process.GetProcessesByName(nameof(TestBeginInvoke));
               var handle = pro.FirstOrDefault().MainWindowHandle;
               ShowWindow(handle, 1);
               ShowWindow(handle, 9);
               SetForegroundWindow(handle);
           }
       }

       [DllImport("USER32.DLL")]
       public static extern bool SetForegroundWindow(IntPtr hWnd);

       [DllImport("user32.dll")]
       private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow);

   }
...