C# 启动进程时出现 System.ComponentModel.Win32Exception - 文件未找到,但文件存在
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13974653/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
System.ComponentModel.Win32Exception when starting process - file not found, but file exists
提问by pascalhein
I am trying to create a manager for my autostarts. It should read an XML file and then start my programs with a custom delay. For example:
我正在尝试为我的自动启动创建一个管理器。它应该读取一个 XML 文件,然后以自定义延迟启动我的程序。例如:
<startup id="0">
<name>Realtek Audio Manager</name>
<process arguments="-s">C:\Program Files\Realtek\Audio\HDA\RtkNGUI64.exe</process>
<delay>5</delay>
</startup>
This runs the specified process (C:\Program Files\...\RtkNGUI64.exe -s
) after 5 seconds.
这会C:\Program Files\...\RtkNGUI64.exe -s
在 5 秒后运行指定的进程 ( )。
Now, three of the programs won't start, giving me a System.ComponentModel.Win32Exception
: "Das System kann die angegebene Datei nicht finden." ("The system was not able to find the specified file.")
现在,三个程序无法启动,给我一个System.ComponentModel.Win32Exception
:“Das System kann die angegebene Datei nicht finden。” (“系统无法找到指定的文件。”)
But the XML is parsed correctly, and the file I want to start is at the location I specified in the XML file.
但是XML被正确解析,我要启动的文件在我在XML文件中指定的位置。
The problem concerns only these three files:
Intel HotkeysCmd - C:\Windows\System32\hkcmd.exe
Intel GFX Tray - C:\Windows\System32\igfxtray.exe
Intel Persistance - C:\Windows\System32\igfxpers.exe
问题仅涉及这三个文件:
Intel HotkeysCmd - C:\Windows\System32\hkcmd.exe
Intel GFX Tray - C:\Windows\System32\igfxtray.exe
Intel Persistance - C:\Windows\System32\igfxpers.exe
I think that the problem comes from the location of the files: they all are located in C:\Windows\System32, and all the other, working programs are located outside (C:\Program Files, C:\Program Files (x86), D:\Program Files, %AppData%
)
我认为问题来自文件的位置:它们都位于 C:\Windows\System32,而所有其他工作程序都位于 (C:\Program Files, C:\Program Files (x86) 之外) , D:\程序文件, %AppData%
)
Do I have to give my program some kind of access rights to start programs in C:\Windows\System32? How would I do that?
我是否必须给我的程序某种访问权限才能在 C:\Windows\System32 中启动程序?我该怎么做?
If not, what could be the reason I get errors with these programs?
如果没有,我在使用这些程序时出错的原因可能是什么?
EDIT - my code:
编辑 - 我的代码:
delegate(object o)
{
var s = (Startup) o;
var p = new System.Diagnostics.Process
{
StartInfo =
new System.Diagnostics.ProcessStartInfo(s.Process, s.Arguments)
};
try
{
s.Process = @"C:\Windows\System32\igfxtray.exe"; // For debugging purposes
System.Diagnostics.Process.Start(s.Process);
icon.ShowBalloonTip(2000, "StartupManager",
"\"" + s.Name + "\" has been started.",
System.Windows.Forms.ToolTipIcon.Info);
}
catch (System.ComponentModel.Win32Exception)
{
icon.ShowBalloonTip(2000, "StartupManager",
"\"" + s.Name + "\" could not be found.",
System.Windows.Forms.ToolTipIcon.Error);
}
}
采纳答案by Hans Passant
Clearly you are using a 64-bit version of Windows. The c:\windows\system32 and c:\program files directories are subject to a feature called "file system redirection". It is an appcompat feature, it helps to ensure that 32-bit processes don't try to use 64-bit executables. They'll get redirectedto c:\windows\syswow64 and c:\program files (x86).
很明显,您使用的是 64 位版本的 Windows。c:\windows\system32 和 c:\program 文件目录受称为“文件系统重定向”的功能的约束。这是一个 appcompat 功能,它有助于确保 32 位进程不会尝试使用 64 位可执行文件。它们将被重定向到 c:\windows\syswow64 和 c:\program 文件 (x86)。
So when you try to start a file in c:\program files\realtek\etcetera, your 32-bit program will be redirected to c:\program files (x86)\realtek\etcetera. A directory that doesn't exist, kaboom. Same ingredient for igfxtray.exe
因此,当您尝试在 c:\program files\realtek\etcetera 中启动文件时,您的 32 位程序将被重定向到 c:\program files (x86)\realtek\etcetera。一个不存在的目录,kaboom。igfxtray.exe 的相同成分
You'll need to change your program's platform target so it can run as a native 64-bit process and avoid the redirection problem you now have. Project + Properties, Build tab, change the "Platform target" setting to AnyCPU.
您需要更改程序的平台目标,以便它可以作为本机 64 位进程运行并避免您现在遇到的重定向问题。项目 + 属性,构建选项卡,将“平台目标”设置更改为 AnyCPU。