0

シンプルなコードに小さな問題があります。このコードは「x86」モードでは正しく動作しますが、「任意の CPU」モードでは機能しません。あるクラスを「x86」で実行し、別のクラスを「任意の 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 ビット OS と 64 ビット OS で異なります。

アプリケーションを 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 に答える