在当前运行的应用程序实例中获取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¶m2=someOtherValue"
另外,如果我试图让他们通过ApplicationDeployment.CurrentDeployment.ActivationUri
它给我的当前r为PARAMS unning app(显然)。
我找到了解决我的问题的办法,虽然不像我预期的那么直截了当。正如我在我的问题中已经解释的那样,已运行的应用程序唯一可以捕获新启动实例的cmd参数的是覆盖OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
。命令参数将在eventArgs
参数中可用,但不是新实例从ClickOnce启动链接接收的参数。
的解决方案,我用: 我离开OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
,这是所谓的SingleInstanceManager
一个单独的类从WindowsFormsApplicationBase
继承完好,(以后我一会儿,我去了解,我没有让这里ClickOnce
参数的机会)。
取而代之,我修改了App.xaml.cs
的void static Main(string[] args)
方法。主要修改:
- 我通过
ApplicationDeployment.CurrentDeployment.ActivationUri
得到了ActivationUri
; - 用
Query
作为ActivationUri
的一个字符串; - 将该字符串添加到
args
参数中; - 将该参数传递给
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
。希望这会帮助某人。
你有没有尝试AppDomain。CurrentDomain.SetupInformation.ActivationArguments.ActivationData [0]? – mm8
@ mm8不幸的是,与ApplicationDeployment.CurrentDeployment.ActivationUri相同 - 当前正在运行的实例的数据 – Alex
当然......当前正在运行的实例应该如何知道命令行参数或其他有关不同实例的其他信息? – mm8