Как запустить 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 (когда важен исходный каталог процесса?) ...

Другие вопросы по тегам