Question

J'ai un petit problème avec du code simple.Ce code fonctionne correctement en mode "x86" mais pas en mode "Any CPU", peut-être est-il possible d'exécuter une classe sur "x86" et une autre classe sur le mode "Any CPU"?Code:

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;
    }
}
}
Était-ce utile?

La solution

Cela est dû à la redirection du registre .

La structure du registre est différente pour les systèmes d'exploitation 32 bits et 64 bits.

En supposant que vous exécutez votre application sur une machine 64 bits, la compilation pour la cible x86 permet à votre programme de s'exécuter en mode WOW64 (processus 32 bits sur 64 bits) et vous lisez les clés sous le nœud Wow6432.Voir Comportement étrange lors de la lecture du registre en C #

Autres conseils

Lorsqu'elle est exécutée en 32 bits, la clé de registre est redirigée.Lorsque vous exécutez en 64 bits, il ne sera pas redirigé et n'atteindra donc plus la clé vers laquelle l'entrée de registre d'Adobe a été redirigée.

Je créerais donc une fonction Find32BitRegEntry(string path), qui ne fait rien sur 32 bits, et ajoute la redirection sur x64.

Les clés de registre peuvent se trouver à un endroit différent sur des machines 64 bits - voir ceci .(Notez que RegistryKey dans votre exemple de code provient de Microsoft.Win32?)

Je pense que vous devez utiliser un redirecteur de registre, on en parle ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top