Как запустить 64-разрядный процесс из 32-битного процесса
Я пытаюсь запустить 64-битный исполняемый файл (java.exe) из нашего 32-битного .NET-приложения. Я использую класс Process
и вызываю cmd /c <command name>
, чтобы поддерживать все возможные команды (например, dir
, cd
и т.д.).
Проблема в том, что на моей машине я установил 64-разрядную версию JRE, а java.exe доступен только в папке C:\Windows\System32
(x64). Я попытался объяснить 64-разрядную версию cmd.exe
, вызвав C:\Windows\System32\cmd.exe
, но перенаправляется на SysWOW64
из-за того, что процесс вызова составляет 32 бит.
Есть ли что-нибудь еще, что я могу сделать, чтобы заставить это работать?
EDIT Вся вещь cmd /c
- это немного красная селедка. Это не часть проблемы, возможность запуска 64-разрядных исполняемых файлов.
Ответы
Ответ 1
Вы можете временно отключить перенаправление файловой системы вокруг вызова Process.Start, соответствующий API для P/Invoke Wow64DisableWow64FsRedirection и Wow64RevertWow64FsRedirection.
Другим вариантом является использование% windir%\sysnative, доступного в Windows Vista и выше.
Ответ 2
Что вы делаете, так это то, что вы используете% windir%\sysnative для разрешения 64-разрядного CMD.EXE, а затем вы запускаете свою другую 64-битную программу с помощью командной строки "/c".
Ответ 3
c:\>set proc
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 70 Stepping 1, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=4601
c:\>c:\windows\sysnative\cmd
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
c:\>set proc
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 70 Stepping 1, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=4601
c:\>
Ответ 4
На всякий случай это может помочь.
http://msdn.microsoft.com/en-us/library/aa384187(VS.85).aspx
Обратите внимание, что если приложение проявляется, чтобы показать приглашение UAC, перенаправление не произойдет. А также некоторые папки освобождаются от перенаправления.
Ответ 5
"sysnative", кажется, имеет некоторые недостатки.
Пример: при запуске powershell.exe через C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe
некоторые CmdLets, такие как Get-AppxProvisionedPackage" and "Get-WindowsCapability
, не работают/генерируют исключения:
Get-AppxProvisionedPackage: "Ошибка установки текущего каталога на" C:\Windows\SysNative\WindowsPowerShell\v1.0 ": часть пути" C:\Windows\SysNative\WindowsPowerShell\v1.0 "не найдена"
(перевод с немецкого "Fehler beim Festlegen des aktuellen Verzeichnisses auf" C:\Windows\SysNative\WindowsPowerShell\v1.0 ": Ein Teil des Pfades" C:\Windows\SysNative\WindowsPowerShell\v1.0 "konnte nicht gefunden werden. ")
Могут быть похожие проблемы при запуске других процессов, кроме powershell (когда важен каталог с исходным кодом процесса?)...