2013-04-26 93 views
1

没有错误。没有例外。第二和第三产生一个文件f [1]/[2]。但不是第一次。为什么?我使用调试来验证命令是否正确。并使用从调试捕获的命令,剪切和过去命令行,我可以生成文件[f0]。C#运行过程奇怪的东西

 string[] f = new string[4]; 
     f[0] = "SNICKER.reg.txt"; 
     f[1] = "SNDIS.reg.txt"; 
     f[2] = "SNICS.reg.txt"; 
     f[3] = "Ssmf.xml"; 

     //First 
     Run_Process("REG", "EXPORT HKEY_LOCAL_MACHINE\\SOFTWARE\\sridge\\Snicker " + f[0] + " /y"); 

     //Second 
     Run_Process("REG", "EXPORT HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\SNDIS " + f[1] + " /y"); 

     //Third 
     Run_Process("REG", "EXPORT HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SClass " + f[2] + " /y"); 



    private static void Run_Process(string exe_name, string arg) 
    { 

     Process myProcess = new Process(); 
     try 
     { 
      myProcess.StartInfo.UseShellExecute = false; 
      myProcess.StartInfo.FileName = exe_name; 
      //myProcess.StartInfo.Arguments = "/C getLH.exe > feed.txt"; 
      myProcess.StartInfo.Arguments = arg; 
      myProcess.StartInfo.CreateNoWindow = true; 
      myProcess.Start(); 
      myProcess.WaitForExit(); 

     } 
     catch (Exception ep) 
     { 
      Console.WriteLine(exe_name + " " + arg + ". Error: " + ep.Message); 

     } 
    } 
+0

添加进程返回代码也很有帮助:Console.WriteLine(“Process exit code:{0} “, myProcess.ExitCode); – aquaraga 2013-04-26 20:09:11

+0

您的程序是否为AnyCPU或x86编译? – Steve 2013-04-26 20:10:04

+0

@Steve:AnyCPU – 2013-04-26 20:20:07

回答

2

当您的应用在64位操作系统上运行并且您尝试访问注册表时,您最终可能会读取错误文件夹中的值。
当您为x86平台编译时发生这种情况,因此您的代码将作为32位代码发布。
在这种情况下,注册表重定向器会启动并更改指向HKLM\SOFTWAREHKLM\SOFTWARE\Wow6432Node内的文件夹的手工注册表路径。
这种行为背后的原因是复杂的,你可以尝试读一些here

说,我仍然无法理解得很好,当我们把这个方案从构建的应用程序启动的进程执行的REG程序怎样就怎样与AnyCPU。此应用程序应该作为64位代码执行,但出于某种原因,执行的REG程序是32位版本(是的,REG.EXE有两个版本,一个在system32中,一个在SysWow64中),此版本搜索您的数据在错误的道路上。也许这与PATH环境变量的当前值有关。

作为一个侧面说明。微软做出的最糟糕的决定之一是允许应用程序将其配置数据存储在注册表中。我真的建议改变这种行为,如果可能的话

UPDATE 我可以证实,在64位的操作系统,运行执行如上REG.EXE命令的代码编译为AnyCPU控制台应用程序启动的32位版本REG.EXE从WINDOWS \ SYSWOW64。我检查过ProcMon,我无法解释为什么会发生这种情况。它与PATH env变量无关,因为我只有C:\ WINDOWS \ SYSTEM32的路径

+0

对所有问题都适用,我完全同意你的建议:不要使用注册表来存储应用配置数据。 AppData文件夹是一个更好的选择,详情请参阅[本答案的底部](http://stackoverflow.com/questions/5210575/5210642#5210642)。就您的更新而言,如果您正在编译VS 2012上的测试应用程序,[“AnyCPU”选项已变得更加复杂](http://blogs.microsoft.co.il/blogs/sasha/archive/2012/ 04/04 /什么-anycpu-真的入息作为-的净4-5和视觉工作室11.aspx)。它实际上是一个32位应用程序,所以你看到的行为是有道理的。 – 2013-04-26 22:51:06

+0

@CodyGray,现在很清楚,谢谢。 Duh,'在.NET 4.5和Visual Studio 11中,奶酪已经移动了。“Redmond的某个人从错误的脚上起床。 – Steve 2013-04-26 23:18:19

+0

就我而言,在VS 2012中,它甚至不再是奶酪。 – 2013-04-26 23:57:52

0

检出Process.start: how to get the output?并尝试使用该方法查看命令的输出。我不认为会有任何异常,因为它只会捕获该代码块的例外情况,而不是您尝试运行的外部程序的例外情况。