通过Arguments在控制台程序间传递信息失败求助
解决控制台程序调用时参数无法传递的问题
问题根源
你在主程序里指定的启动文件是ConsoleApp2.application,这是ClickOnce部署的清单文件,并非可直接执行的exe程序。直接启动这类文件时,系统会通过ClickOnce部署机制启动应用,常规的Arguments参数无法被正确传递到目标程序的Main方法参数中。
解决方案
方案1:直接调用目标程序的EXE文件(推荐)
修改主程序中ProcessStartInfo.FileName的值,指向ConsoleApp2编译生成的实际exe文件路径,而非.application文件:
static void Main() { ProcessStartInfo startinfo = new ProcessStartInfo(); // 替换为ConsoleApp2实际的exe路径,比如项目Debug/Release目录下的文件 startinfo.FileName = @"C:\YourProjectDir\ConsoleApp2\bin\Debug\ConsoleApp2.exe"; startinfo.Arguments = "DateRange ClinetID PhoneNo"; Process.Start(startinfo); }
方案2:若必须使用ClickOnce部署的应用
如果ConsoleApp2是通过ClickOnce发布的,需用特殊方式传递参数:
- 主程序中通过
rundll32.exe启动ClickOnce应用并传递参数:static void Main() { ProcessStartInfo startinfo = new ProcessStartInfo(); startinfo.FileName = "rundll32.exe"; // 替换为你的ClickOnce部署地址,参数附加在末尾 startinfo.Arguments = "dfshim.dll,ShOpenVerbApplication https://your-deploy-url/ConsoleApp2.application DateRange ClinetID PhoneNo"; Process.Start(startinfo); } - 目标程序中通过ClickOnce的激活上下文获取参数,而非依赖
Main方法的args数组:
注意:此方式需要为ConsoleApp2项目添加using System.Deployment.Application; using System.Web; namespace ConsoleApp2 { class Program { static void Main(string[] args) { if (ApplicationDeployment.IsNetworkDeployed) { var queryParams = HttpUtility.ParseQueryString(ApplicationDeployment.CurrentDeployment.ActivationUri.Query); Console.WriteLine("Received ClickOnce arguments:"); foreach (string key in queryParams.AllKeys) { Console.WriteLine($"{key} = {queryParams[key]}"); } } else { // 兼容常规exe启动的参数处理 Console.WriteLine("Received the following arguments:\n" + args.Length); for (var i = 0; i < args.Length; i++) { Console.WriteLine($"[{i}] = {args[i]}"); } } Console.WriteLine("\nPress any key to exit"); Console.ReadLine(); } } }System.Deployment和System.Web程序集引用。
验证
修改后重新编译主程序与目标程序,启动主程序后,目标程序即可正确接收传递的参数。
内容的提问来源于stack exchange,提问作者Robert Goth
相关产品推荐
相关产品推荐

