C# 运行进程奇怪的东西

C# 运行进程奇怪的东西,c#,process,C#,Process,没有错误。也不例外。第二个和第三个生成文件f[1]/[2]。但不是第一个。为什么?我使用debug验证命令是否正确。使用从debug、cut和pass到命令行捕获的命令,我可以生成文件[f0] string[] f = new string[4]; f[0] = "SNICKER.reg.txt"; f[1] = "SNDIS.reg.txt"; f[2] = "SNICS.reg.txt"; f[3] = "Ssm

没有错误。也不例外。第二个和第三个生成文件f[1]/[2]。但不是第一个。为什么?我使用debug验证命令是否正确。使用从debug、cut和pass到命令行捕获的命令,我可以生成文件[f0]

        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);

        }
    }

签出并尝试使用该方法查看命令的输出。我认为不会有任何异常,因为它只会捕获该代码块的异常,而不会捕获您尝试运行的外部程序的异常。

当您的应用程序在64位操作系统上运行,并且您尝试访问注册表时,您可能会读取错误文件夹中的值。
在为x86平台编译时会发生这种情况,因此您的代码以32位代码的形式发出。
在这种情况下,注册表重定向程序将启动并将指向
HKLM\SOFTWARE
中文件夹的手动注册表路径更改为
HKLM\SOFTWARE\Wow6432Node

这种行为背后的原因很复杂,你可以试着读一些东西

尽管如此,我仍然不能很好地理解当我们将REG程序作为从使用
AnyCPU
构建的应用程序启动的进程来执行时会发生什么。此应用程序应作为64位代码执行,但由于某些原因,执行的REG程序是32位版本(是的,REG.EXE有两个版本,一个在system32中,一个在SysWow64中),此版本在错误路径中搜索数据。这可能与PATH环境变量的当前值有关

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

更新
我可以确认,在64位操作系统上,编译为AnyCPU的控制台应用程序运行上述执行REG.EXE命令的代码,从WINDOWS\SYSWOW64启动32位版本的REG.EXE。我已经和ProcMon核实过了,我无法解释为什么会发生这种情况。它与PATH env变量无关,因为我只有C:\WINDOWS\SYSTEM32的路径。另外,添加进程返回代码也会很有帮助:Console.WriteLine(“进程退出代码:{0}”,myProcess.ExitCode);您的程序是针对任何CPU还是x86编译的?@aquaraga。进程退出代码:1@aquaraga. 所以它有错误,但不知道是什么。我将该命令从方法剪切并粘贴到命令行,如果在32位操作系统上运行,它可以为x86编译;如果在64位操作系统上运行,它可以为x64编译。我完全同意您的建议,不使用注册表存储应用程序配置数据。AppData文件夹是一个更好的选项,有关详细信息,请参阅。就您的更新而言,如果您在VS 2012上编译测试应用程序。它实际上是一个32位的应用程序,所以你看到的行为是有意义的。@CodyGray,现在它很清楚了,谢谢。嗯,
在.NET 4.5和Visual Studio 11中,奶酪被移动了。
雷德蒙德的某个人从床上摔了下来。就我而言,在VS 2012中,奶酪已经不再是奶酪了。