我有一个使用 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¶m2=someOtherValue"
此外,如果我尝试通过ApplicationDeployment.CurrentDeployment.ActivationUri
,它会给我当前正在运行的应用程序的参数(显然)。
答案 0 :(得分:1)
我找到了解决问题的方法,虽然没有像我预期的那么直接。正如我在我的问题中已经解释的那样,已经运行的应用程序可以捕获新启动实例的cmd参数的唯一位置是覆盖OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
。命令参数将在eventArgs
参数中可用,但不是新实例从ClickOnce启动链接接收的参数。
我使用的解决方案:
我离开了OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
,它位于一个名为SingleInstanceManager
的单独的类中,它完整地从WindowsFormsApplicationBase
继承而来(在我知道我没有机会获得ClickOnce
之后这里的参数)。
相反,我修改了void static Main(string[] args)
的{{1}}方法。主要修改:
App.xaml.cs
ActivationUri
; ApplicationDeployment.CurrentDeployment.ActivationUri
; Query
属性中删除了一个字符串
ActivationUri
参数; args
类
上方。整个解决方案最终看起来像这样:
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);
}
。希望这会对某人有所帮助。