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;
    }
}
}
È stato utile?

Soluzione

Questo è a causa di Reindirizzamento del registro.

La struttura del registro è diversa per il sistema operativo a 32 bit e 64 bit.

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.

Le chiavi del registro possono trovarsi in un posto diverso su macchine a 64 bit - vedi questo. (Si noti che il registryKey nel codice di esempio proviene da Microsoft.Win32?)

Penso che tu debba usare un reindirizzatore del registro, ci sono qualche discussione su qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top