Target de plataforma X86 y cualquier CPU
Pregunta
Tengo un pequeño problema con el código simple. Este código funciona correctamente en el modo "x86" pero no en el modo "CPU", ¿tal vez es posible ejecutar una clase en "x86" y otra clase en el modo "CPU"? Código:
namespace Software_Info_v1._0
{
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
public class Adobe
{
public string GetAdobeVersion()
{
try
{
RegistryKey adobe = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Adobe");
if (adobe != null)
{
RegistryKey acroRead = adobe.OpenSubKey("Acrobat Reader");
if (acroRead != null)
{
string[] acroReadVersions = acroRead.GetSubKeyNames();
foreach (string versionNumber in acroReadVersions)
{
Console.WriteLine("Acrobat Reader version: " + versionNumber);
}
}
}
}
catch
{
}
return null;
}
}
}
Solución
Esto se debe a redirección del registro.
La estructura del registro es diferente para el sistema operativo de 32 bits y 64 bits.
- Mira esto Artículo de MSDN para más información.
- Ver también esto Tan hilo.
Suponiendo que está ejecutando su aplicación en una máquina de 64 bits, la compilación de Target X86 hace que su programa se ejecute usando el modo WOW64 (proceso de 32 bits en 64 bits) y está leyendo claves bajo WOW6432Node. Ver Comportamiento extraño al leer registro en C#
Otros consejos
Cuando se ejecuta como 32 bits, la clave de registro se redirige. Cuando se ejecute como 64 bits, no se redirige y, por lo tanto, no alcanzará la clave a la que la entrada del registro de Adobe se redirigió más.
Así que crearía un Find32BitRegEntry(string path)
Funciona, eso no hace nada en 32 bits y agrega la redirección en x64.