Как запустить 64-разрядный процесс из 32-разрядного процесса

StackOverflow https://stackoverflow.com/questions/2003573

Вопрос

Я пытаюсь запустить 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-разрядные исполняемые файлы.

Это было полезно?

Решение

Вы можете временно отключить перенаправление файловой системы при вызове Process.Запустите соответствующий API для P / Invoke. wow64disablewow64fsредакция и wow64revertwow64fsредакция.

Другой вариант - использовать %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:\>

Просто на случай, если это может помочь..http://msdn.microsoft.com/en-us/library/aa384187 (ПРОТИВ 85).aspx

Обратите внимание, что если приложение отображается для отображения запроса UAC, то перенаправление не произойдет.А также некоторые папки освобождены от перенаправления.

Похоже, у "sysnative" есть некоторые недостатки.

Пример:Когда вы начнете powershell.exe через C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe некоторые командлеты, такие как Get-AppxProvisionedPackage" and "Get-WindowsCapability не работают / выбрасывают исключения:

Получить-AppxProvisionedPackage:"Ошибка установки текущего каталога в "C:\Windows\SysNative\WindowsPowerShell\v1.0 ":Часть пути "C:\Windows\SysNative\WindowsPowerShell\v1.0 " не удалось найти"

(translated from German "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 (всякий раз, когда важен исходный каталог процесса?) ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top