Как запустить 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-битный.
Есть ли что-нибудь еще, что я могу сделать, чтобы заставить это работать?
РЕДАКТИРОВАТЬ Весь cmd /c
вещь немного красной селедки. Это не является частью проблемы, возможность запуска 64-битных исполняемых файлов.
7 ответов
Вы можете временно отключить перенаправление файловой системы при вызове Process.Start, соответствующие API для P/Invoke: Wow64DisableWow64FsRedirection и Wow64RevertWow64FsRedirection.
Другой вариант - использовать%windir%\sysnative, который доступен в Windows Vista и выше.
Что вы делаете, вы используете%windir%\sysnative для разрешения 64-битного CMD.EXE, а затем запускаете другую 64-битную программу с помощью параметра командной строки "/c".
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:\>
Чтобы запустить процесс / скрипт через 64-битный cmd.exe, вы можете использовать это:
%windir%\SysWOW64\cmd.exe /c %windir%\sysnative\cmd.exe /c ProgramToRun parameters
Это решение универсально работает как с 32-битными, так и с 64-битными процессами.
ps
% windir% \ sysnative существует только в 32-битных процессах.
%windir%\SysWOW64 существует как в 32-битных, так и в 64-битных процессах.
На всякий случай это может помочь.. http://msdn.microsoft.com/en-us/library/aa384187(VS.85).aspx
Обратите внимание, что если приложение отображает приглашение UAC, перенаправление не будет выполнено. А также некоторые папки освобождены от перенаправления.
Вот способ внутри окна cmd переключиться на 64-битную cmd, если вы окажетесь в 32-битной версии:
if %PROCESSOR_ARCHITECTURE%==x86 %windir%\sysnative\cmd
Или условно выполнить в 64-битном режиме из 32-битного пакетного процесса:
if %PROCESSOR_ARCHITECTURE%==x86 "%windir%\sysnative\cmd" /c "someProgram"
Или даже лучше:
set "commands=multiple commands & to execute"
if %PROCESSOR_ARCHITECTURE%==x86 ( "%windir%\sysnative\cmd" /c "%commands%" ) else ( %commands% )
"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 (когда важен исходный каталог процесса?) ...