你問的問題不能在.NET中完成,因爲Environment
類緩存命令行,並且沒有屬性訪問器來設置它。 (更正確地說,啓動代碼將命令行和Environment.CommandLine
調用緩存到運行時以獲取該緩存值。)
在原生Windows應用程序中,GetCommandLine()
API函數返回一個指向操作系統呈現的命令行的指針到程序。程序可以調用CommandLineToArgvW
將命令行解析爲C和C++程序員熟悉的標準argv
和argc
參數。
Environment
類使用類似的東西。當您致電Environment.GetCommandLineArgs
時,它會訪問Environment.CommandLine
屬性,然後調用窗口函數CommandLineToArgvW
來解析命令行。但Environment.CommandLine
未從GetCommandLine()
獲得其值。相反,程序在啓動時會獲取Windows命令行(通過調用GetCommandLine()
),然後進行保存。
這是不幸的,因爲你可以修改的值回報,這個小片段作爲證明:
[DllImport("kernel32")]
static extern IntPtr GetCommandLine();
static void DoIt()
{
IntPtr pcmdline = GetCommandLine();
Console.WriteLine("Environment.CommandLine = {0}", Environment.CommandLine);
string realCmdLine = Marshal.PtrToStringAnsi(pcmdline);
Console.WriteLine("realCmdLine = {0}", realCmdLine);
Console.WriteLine("** Modify command line");
// Modify the command line
byte[] bytes = Encoding.ASCII.GetBytes("ham and swiss on rye\0");
Marshal.Copy(bytes, 0, pcmdline, bytes.Length);
Console.WriteLine("Environment.CommandLine = {0}", Environment.CommandLine);
pcmdline = GetCommandLine();
realCmdLine = Marshal.PtrToStringAnsi(pcmdline);
Console.WriteLine("realCmdLine = {0}", realCmdLine);
}
如果您運行,你會發現,Environment.CommandLine
都返回相同的字符串次,而第二次您撥打時,您將收回字符串ham and swiss on rye
。
即使上述沒有的工作,也不能保證它能解決您的問題。第三方控件可能會解析命令行,緩存登錄信息,並且永遠不會再分析命令行。
+ 1作爲一個很好的解釋,儘管可惜它不能幫助我,因爲第三方對話框使用'Environment.GetCommandLineArgs()',它保持不變。 – Rachel