我有一个似乎是一个我无法解决的简单问题。我有一个WinForm应用程序,修改了main方法以接受命令行参数,如下所示:
[STAThread]
static void Main(String[] args)
{
int argCount = args.Length;
}
当在调试模式下使用以下执行行编译时,此代码正常工作并且argCount等于2:program.exe -file test.txt。 但是,只要我在发布模式下编译程序,argCount现在为1,具有相同的命令行参数。唯一的参数包含“-file test.txt”。更重要的是,只有当我从obj / Release文件夹运行已编译的可执行文件时才会发生,而不是从bin / Release运行。不幸的是,安装项目从obj / Release获取可执行文件,所以我无法改变它。 这是一个已知的问题,是否有办法解决这个问题?
答案 0 :(得分:1)
命令行处理应该是相同的,因此还会发生其他事情。当我尝试这个时:
class Program {
[STAThread]
static void Main(String[] args) {
Console.WriteLine("Have {0} arguments", args.Length);
for (int i = 0; i < args.Length; ++i) {
Console.WriteLine("{0}: {1}", i, args[i]);
}
}
}
然后从各个位置获得100%一致的结果,获取参数“merged”的唯一方法是将它们用命令行中的引号括起来(具体是允许你有包含空格的参数) ,见下面的最后一个例子):
PS C:\...\bin\Debug> .\ConsoleApplication1.exe one two three Have 3 arguments 0: one 1: two 2: three PS C:\...\bin\Debug> pushd ..\release PS C:\...\bin\Release> .\ConsoleApplication1.exe one two three Have 3 arguments 0: one 1: two 2: three PS C:\...\bin\Release> pushd ..\..\obj\debug PS C:\...\obj\Debug> .\ConsoleApplication1.exe one two three Have 3 arguments 0: one 1: two 2: three PS C:\...\obj\Debug> pushd ..\release PS C:\...\obj\Release> .\ConsoleApplication1.exe one two three Have 3 arguments 0: one 1: two 2: three PS C:\...\obj\Release> .\ConsoleApplication1.exe -file test.txt Have 2 arguments 0: -file 1: test.txt PS C:\...\obj\Release> .\ConsoleApplication1.exe "-file test.txt" Have 1 arguments 0: -file test.txt
附加从命令提示符启动时,可以轻松查看正在传递的内容,因此很难检查其他应用程序何时启动您的应用程序。但是Process Explorer之类的工具会显示用于启动程序的命令行(双击进程并查看图像选项卡)。
答案 1 :(得分:1)
这适用于bin / Debug,bin / Release,obj / Debug和obj / Release:
static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args) {
FormMain.Args = args;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}
}
public partial class FormMain: Form {
public static string[] Args;
public FormMain() {
InitializeComponent();
}
private void FormMain_Shown(object sender, EventArgs e) {
foreach (string s in Args) {
MessageBox.Show(s);
}
}
}
答案 2 :(得分:0)
答案 3 :(得分:0)
您的问题(正如Richard在其代码中指出的那样)是您运行发布版本时的参数都包含在一组引号中。删除引号,它将起作用。