Файл копируется в SysWOW64 вместо System32
Я должен скопировать утилиту psTool в папку System32, когда мое приложение работает.
Я на 64-битной Windows 7 и всякий раз, когда я пытаюсь скопировать EXE в папку system32 bit через File.Copy
EXE всегда копируется в SysWow64 вместо этого.
Когда я ставлю точку останова на destFile, путь отображается как C:\Windows\System32
но файл не входит туда (идет к sysWow64). Я попробовал Special Folder
SystemX86
, но файл снова переходит к sysWOW64.
string sourceFile = "C:\bin\Debug\somexe.exe"
string destFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), utilityName);
File.Copy(sourceFile, destFile, true);
Любые предложения, что мне здесь не хватает?
РЕДАКТИРОВАТЬ
Как указано ниже в ответе, происходит перенаправление файловой системы. Я занимаюсь разработкой приложения с настройками Visual Studio по умолчанию для консольного приложения в 64-битной ОС. Я не уверен, какие настройки / переключатели должны быть сохранены во время компиляции, чтобы приложение работало как на 32-битной, так и на 64-битной ОС.
По сути, он должен просто установить копию файла в System32
только независимо от того, какая битная ОС это.
Позже в программе я должен получить доступ к утилите psTools через командную строку, которая недоступна, если я помещу ее в SysWOW64. Если я внесу изменения, чтобы использовать 32-битный cmd.exe SysWOW64, это опять-таки будет нечто, специфичное для 64-битной платформы, которое я не хочу выбирать.
Любое решение, при котором приложение может работать как на 32-битной, так и на 64-битной системе без проблем? Должен ли я изменить код (как?) Или мне нужно изменить некоторые свойства этого проекта консольного приложения (какие свойства)?
4 ответа
Вы столкнулись с проблемой перенаправления файловой системы.
Так как %windir%\System32
зарезервировано исключительно для 64-разрядных приложений, в 64-разрядных версиях Windows 32-разрядных приложений, которые пытаются получить доступ к %windir%\System32
каталог автоматически и прозрачно перенаправляется на 32-битный %windir%\SysWOW64
каталог.
Во-первых, убедитесь, что ваша программа действительно принадлежит к 64-битной системной папке. Windows делает это автоматическое перенаправление по причине. 32-битные вещи не идут в %windir%\System32
папка на 64-битных версиях Windows.
Если вы уверены, что хотите копировать данные в 64-битный системный каталог, у вас есть несколько вариантов. Возможно, проще всего просто скомпилировать вашу утилиту как 64-битное приложение. Кроме того, вы можете сообщить перенаправителю WOW64, что вы знаете, что делаете, и не выполнять перенаправление с помощью %windir%\Sysnative
вместо %windir%\System32
,
У меня такая же проблема. Решением является установка "цели платформы" как x64 или AnyCPU вместо x86 в свойствах проекта в Visual Studio. В этом случае путь будет "C:\Windows\system32"
и не будет перенаправлять на "C:\Windows\SysWOW64"
Вы можете проверить это, поместив любой файл в папку "C:\Windows\SysWOW64", а затем использовать File.Exists
Команда, чтобы проверить, найден ли файл в этой папке:
File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), sFileName));
Или же
File.Exists(Path.Combine(Environment.SystemDirectory, sFileName));
Я использую вспомогательное свойство в моих 32-битных приложениях, которые всегда возвращают родную папку system32. Свойство helper:
public static string NativeSystemPath
{
get
{
if (Environment.Is64BitOperatingSystem)
{
return System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Windows),
"Sysnative");
}
return Environment.GetFolderPath(Environment.SpecialFolder.System);
}
}
Как переменная окружения пути содержит c:\windows
на обеих версиях Windows x86/x64, почему бы не положить свой инструмент в c:\windows
: %windir%
?
В моем случае это решит мою проблему.