c# - org - Cómo obtener el directorio de "archivos de programa" de 64 bits en la aplicación de 32 bits
mapwindows 5 (4)
Tengo una aplicación compilada en modo x86 (en c #) desde la cual necesito acceder a cierto archivo que existe en la carpeta de archivos de programa de 64 bits (por supuesto, de un Windows de 64 bits). No quiero simplemente codificar C:/Program Files
como una cadena en mi aplicación porque algunas computadoras de destino pueden tener instalado Windows en una unidad diferente, o puede estar en otros idiomas.
El problema que encuentro es que al usar Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
devuelve el sabor x86 en lugar del directorio deseado, a menos que compile mi programa en modo de 64 bits. Por curiosidad, ¿qué puedo hacer para evitar hacer eso?
Había una opción llamada "preferir 32 bits" en las propiedades del proyecto. Desmarcar esa opción hizo el truco. Todavía estoy interesado en una solución de código en lugar de esto, sin embargo.
De hecho, creo que inhabilitar Prefer 32bit en las opciones de compilación es la mejor manera de hacerlo. Si no desea que su programa sea tratado como un proceso de 32 bits, ¿por qué no hacerlo un proceso de 64 bits y ahorrarse algunos problemas?
Ver también este artículo sobre el tema por Raymond Chen .
Habiendo dicho eso, la variable de entorno ProgramW6432 sugerida por griddoor funcionó bien para mí cuando lo probé.
Dado que puede estar razonablemente seguro:
- Los directorios de archivos de programa existen en la misma unidad que el sistema está instalado.
- Se denominan Archivos de programa para x64 y x86, y Archivos de programa (x86) para x64.
Entonces podrías hacer algo como esto:
public static void Main(string[] args)
{
string baseDirectory = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System));
string programFiles = "Program Files";
string programFilesX86 = "Program Files (x86)";
Console.WriteLine(Environment.Is64BitProcess ? "64-Bit Process" : "32-Bit Process");
if (Environment.Is64BitOperatingSystem)
{
Console.WriteLine("64-bit operating system");
Console.WriteLine("Program Files Directory: " + Path.Combine(baseDirectory, programFiles));
Console.WriteLine("Program Files x86 Directory: " + Path.Combine(baseDirectory, programFilesX86));
}
else
{
Console.WriteLine("32-bit operating system");
Console.WriteLine("Program Files Directory: " + Path.Combine(baseDirectory, programFiles));
}
Console.ReadKey(true);
}
Sin embargo, hay una cosa a tener en cuenta:
Los directorios de archivos de programa se pueden cambiar, aunque Microsoft no lo admite y puede ocasionar otros problemas del sistema.
Así que los seguiría con un buen Directory.Exists
y si no los encuentras, entonces puedes buscar en el registro. Las claves que estás buscando son:
HKLM / SOFTWARE / Microsoft / Windows / CurrentVersion /
- ProgramFilesDir
- ProgramFilesDir (x86)
Pero, de nuevo, con el acceso al registro hay algunas advertencias que son difíciles de obtener, al usar la clase Registry
, seleccionará el registro de 64 bits o de 32 bits en función de la arquitectura del procesador del proceso que lo solicite. Puede especificar el directorio de 64 bits. No quiero entrar demasiado, hay muchos tutoriales sobre cómo leer el registro.
También tenga en cuenta que esto solo funciona con Windows Vista y versiones posteriores, no recuerdo cómo lo manejó el extraño Windows XP-64, o versiones anteriores de Windows Server.
Y la última nota, Linux / Android / iOS (también conocido como sistemas operativos Mono compatibles o Micro Framework) no tiene un directorio de "Archivos de programa", así que asegúrese de que se da cuenta de que está escribiendo aquí el código específico del sistema operativo. Si desea que sea un poco más independiente del sistema operativo, considere escribir una función que pueda devolver una serie de cadenas basadas en el sistema operativo actual para los directorios de instalación predeterminados.
Me temo que el WinAPI no es compatible con lo que necesita. Debido a la virtualización, no es posible que una aplicación de 32 bits obtenga la ruta a los directorios de 64 bits.
Cualquier intento de "adivinar" el camino correcto o usar el registro podría causar un problema en el futuro ...
En Configuración de compilación, desmarque la opción Prefer 32-bit
. Ahora Environment.SpecialFolder.ProgramFilesX86
devolverá una ruta de 32 bits y Environment.SpecialFolder.ProgramFiles
devolverá una ruta de 64 bits.