Target della piattaforma X86 e qualsiasi CPU
Domanda
Ho un piccolo problema con il codice semplice. Questo codice funziona correttamente sulla modalità "x86" ma non sulla modalità "CPU", forse è possibile eseguire una classe su "x86" e un'altra classe su modalità "qualsiasi CPU"? Codice:
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;
}
}
}
Soluzione
Questo è a causa di Reindirizzamento del registro.
La struttura del registro è diversa per il sistema operativo a 32 bit e 64 bit.
- Guarda questo Articolo MSDN per maggiori informazioni.
- Vedi anche questo Quindi thread.
Supponendo che tu stia eseguendo l'applicazione su una macchina a 64 bit, la compilazione per il target X86 fa funzionare il programma utilizzando la modalità WOW64 (processo a 32 bit su 64 bit) e stai leggendo le chiavi sotto il WOW6432Node. Vedere Comportamento strano quando si legge nel registro in c#
Altri suggerimenti
Quando si esegue come 32 bit, la chiave del registro viene reindirizzata. Quando corri come 64 bit, non verrà reindirizzato e quindi non raggiungerà la chiave a cui è stata più reindirizzata la voce del registro di Adobe.
Quindi creerei un Find32BitRegEntry(string path)
funzione, che non fa nulla su 32 bit e aggiunge il reindirizzamento su X64.