Come avviare un processo a 64 bit da un processo a 32 bit
-
18-09-2019 - |
Domanda
Sto cercando di eseguire un file eseguibile a 64 bit (java.exe) dalla nostra applicazione .NET a 32 bit. Sto usando classe Process
e cmd /c <command name>
invocando al fine di sostenere tutti i comandi possibili (come dir
, cd
ecc).
Il problema è che sulla mia macchina ho installato la versione a 64 bit di JRE e java.exe è disponibile solo dalla cartella C:\Windows\System32
(x64). Ho provato explicily di partenza la versione a 64 bit di cmd.exe
chiamando C:\Windows\System32\cmd.exe
ma viene reindirizzato a SysWOW64
grazie al processo di chiamare sia a 32 bit.
C'è qualcos'altro che posso fare per ottenere questo lavoro?
Modifica Il tutto cmd /c
è un po 'di una falsa pista. Non è parte del problema, essendo in grado di funzionare a 64 bit eseguibili è.
Soluzione
È possibile disabilitare temporaneamente il reindirizzamento filesystem intorno la chiamata alla Process.Start, le API appropriate di a P / Invoke sono Wow64DisableWow64FsRedirection e Wow64RevertWow64FsRedirection .
Un'altra opzione è quella di utilizzare% windir% \ sysnative, che è disponibile su Windows Vista e sopra.
Altri suggerimenti
Quello che fate è si utilizza% windir% \ sysnative per risolvere 64 bit cmd.exe e quindi si avvia il vostro altro programma a 64 bit tramite "/ c" linea di comando.
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:\>
Nel caso in cui questo potrebbe aiutare .. http://msdn.microsoft.com/en-us /library/aa384187(VS.85).aspx
Si noti che se l'applicazione si manifesta per mostrare il prompt UAC, quindi il reindirizzamento non sarà effettuata. E anche alcune cartelle sono esenti da reindirizzamento.
"sysnative" sembra avere alcuni svantaggi.
Esempio:
Quando si avvia powershell.exe via C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe
Alcuni cmdlet come Get-AppxProvisionedPackage" and "Get-WindowsCapability
non funzionano / generare eccezioni:
Get-AppxProvisionedPackage: "Errore impostazione directory corrente "C: \ Windows \ SysNative \ WindowsPowerShell \ v1.0": parte del percorso "C: \ Windows \ SysNative \ WindowsPowerShell \ v1.0" non è stato trovato "
(tradotto dal tedesco "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. ")
Ci potrebbero essere problemi simili in esecuzione altri processi di PowerShell (ogni volta che la directory di origine processo è importante?) ...