0

我对简单的代码有小问题。此代码在“x86”模式下正常工作,但在“Any CPU”模式下无法正常工作,也许可以在“x86”模式下运行一个类,在“Any CPU”模式下运行另一个类?代码:

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;
    }
}
}
4

3 回答 3

7

这是因为注册表重定向

注册表的结构对于 32 位和 64 位操作系统是不同的。

假设您在 64 位机器上运行您的应用程序,为 x86 目标编译会使您的程序使用 WOW64 模式(64 位上的 32 位进程)运行,并且您正在读取 Wow6432Node 下的密钥。请参阅在 C# 中读取注册表时的奇怪行为

于 2012-02-21T14:44:15.157 回答
1

当以 32 位运行时,注册表项会被重定向。当您以 64 位运行时,它不会被重定向,因此不会再点击 adobe 的注册表项被重定向到的键。

所以我会创建一个Find32BitRegEntry(string path)函数,它在 32 位上什么都不做,并在 x64 上添加重定向。

于 2012-02-21T14:43:03.057 回答
0

注册表项在 64 位机器上可以位于不同的位置 - 请参阅。(请注意示例代码中的 RegistryKey 来自 Microsoft.Win32 ?)

我认为您需要使用注册表重定向器,这里有一些讨论。

于 2012-02-21T14:49:16.747 回答