在当前运行的应用程序实例中获取ClickOnce查询参数

问题描述:

我有一个WPF应用程序,它使用ClickOnce部署。它在启动时有一些查询参数,我们通过ApplicationDeployment.CurrentDeployment.ActivationUri获得。此方法工作得很好,但现在该应用程序是单一实例。我们通过从Microsoft.VisualBasic dll实施WindowsFormsApplicationBase来处理“单个实例”。在当前运行的应用程序实例中获取ClickOnce查询参数

因此,当一个应用程序的新实例启动时,我应该得到查询参数,并在已经运行的应用程序中处理它们。我的问题是,当使用点击一次启动应用程序时,我无法获得查询参数。

我试图通过覆盖WindowsFormsApplicationBase类的OnStartupNextInstance来获取参数,如:

protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) 
{ 
    var queryString = eventArgs.CommandLine; 
    //handle queryStringParams 
} 

eventArgs.CommandLine有0个元素使用的ClickOnce启动时,但它确实有元素时我启动我的应用程序通过命令行,像这样:

myApp.exe "param1=someValue&param2=someOtherValue" 

另外,如果我试图让他们通过ApplicationDeployment.CurrentDeployment.ActivationUri它给我的当前r为PARAMS unning app(显然)。

+0

你有没有尝试AppDomain。CurrentDomain.SetupInformation.ActivationArguments.ActivationData [0]? – mm8

+0

@ mm8不幸的是,与ApplicationDeployment.CurrentDeployment.ActivationUri相同 - 当前正在运行的实例的数据 – Alex

+0

当然......当前正在运行的实例应该如何知道命令行参数或其他有关不同实例的其他信息? – mm8

我找到了解决我的问题的办法,虽然不像我预期的那么直截了当。正如我在我的问题中已经解释的那样,已运行的应用程序唯一可以捕获新启动实例的cmd参数的是覆盖OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)。命令参数将在eventArgs参数中可用,但不是新实例从ClickOnce启动链接接收的参数。

的解决方案,我用: 我离开OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs),这是所谓的SingleInstanceManager一个单独的类从WindowsFormsApplicationBase继承完好,(以后我一会儿,我去了解,我没有让这里ClickOnce参数的机会)。

取而代之,我修改了App.xaml.csvoid static Main(string[] args)方法。主要修改:

  1. 我通过 ApplicationDeployment.CurrentDeployment.ActivationUri得到了ActivationUri;
  2. Query作为ActivationUri的一个字符串;
  3. 将该字符串添加到args参数中;
  4. 将该参数传递给SingleInstanceManager类,如上所述 。

整个解决方案最终是这样的:

 [STAThread] 
     public static void Main(string[] args) 
     { 
      AppDomain currentDomain = AppDomain.CurrentDomain; 

      //Creating SingleInstaceManager 
      SingleInstanceManager manager = new SingleInstanceManager(); 

      //Uncommend the following if statement if you want to debug App's Main method 
      //if (!System.Diagnostics.Debugger.IsAttached) 
      //{ 
      // System.Diagnostics.Debugger.Launch(); 
      //} 

      try 
      { 
       if (ApplicationDeployment.CurrentDeployment.ActivationUri != null) 
       { 
        var query = ApplicationDeployment.CurrentDeployment.ActivationUri?.Query; 

        var cmdParams = string.IsNullOrWhiteSpace(query) 
         ? new NameValueCollection(0) 
         : HttpUtility.ParseQueryString(query); 

        var updatedArgs = args.ToList(); 
        updatedArgs.Add(cmdParams.ToString()); 
        args = updatedArgs.ToArray(); 
       } 
      } 

      //Empty catch to ignore the annoying InvalidDeploymentException while debuging; 
      catch (InvalidDeploymentException) 
      { } 

      //Passing parameters to the SingleInstaceManager 
      manager.Run(args); 
     } 

注:

该解决方案是不是WPF具体而已,它应该对任何类型的桌面应用程序的工作,只要因为它有一个入口点,您可以在其中获得ActivationUri。希望这会帮助某人。