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

时间:2017-04-18 14:01:42

标签: c# wpf clickonce

我有一个使用 ClickOnce 部署的WPF应用。它在启动时有一些查询参数,我们通过ApplicationDeployment.CurrentDeployment.ActivationUri获得。这种方法运行得很好,但现在应用程序是单实例。我们处理"单个实例"通过WindowsFormsApplicationBase dll实施Microsoft.VisualBasic

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

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

protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
 {
    var queryString = eventArgs.CommandLine;
    //handle queryStringParams
 }
使用 ClickOnce 启动时,

eventArgs.CommandLine有0个元素,但是当我通过命令行启动应用时它确实有元素,如下所示:

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

此外,如果我尝试通过ApplicationDeployment.CurrentDeployment.ActivationUri,它会给我当前正在运行的应用程序的参数(显然)。

1 个答案:

答案 0 :(得分:1)

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

我使用的解决方案: 我离开了OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs),它位于一个名为SingleInstanceManager的单独的类中,它完整地从WindowsFormsApplicationBase继承而来(在我知道我没有机会获得ClickOnce之后这里的参数)。

相反,我修改了void static Main(string[] args)的{​​{1}}方法。主要修改:

  1. 我通过了App.xaml.cs ActivationUri;
  2. ApplicationDeployment.CurrentDeployment.ActivationUri;
  3. Query属性中删除了一个字符串
  4. 将该字符串添加到ActivationUri参数;
  5. 将该参数传递给所描述的args类 上方。
  6. 整个解决方案最终看起来像这样:

    SingleInstanceManager

    注意:

    此解决方案不仅仅是WPF,它适用于任何类型的桌面应用程序,只要它有一个入口点,您可以在其中获取 [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); } 。希望这会对某人有所帮助。