15

x86としてコンパイルされたアプリケーションを実行しており、64ビットWindowsで実行されています。

ClickOnceファイルの関連付けに関する問題を修正するために、レジストリのx86ビューからいくつかのCLSID値を読み取り、それらをx64ビューに書き込みます。

明確にするために、これは、x86アプリケーションから、x86レジストリビューから同時に読み取り、次にx64レジストリビューに書き込みたいことを意味します。下で見つけた値を取得して、にHKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}書き込みますHKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}

これはどのようにすればよいですか?aを使用するRegistryViewと、予期しない結果が生じます。たとえば、このOpenSubKey呼び出しはnullを返します。

keyPath = @"Software\Classes\CLSID\" + clsid;
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree);

使用するRegistryView.RegistryDefaultか、代わりにキーを返しますが、そのキーはx64ビューに存在せず、リダイレクトが行われないため、RegistryView.Registry64使用するとnullが返されると予想されます。Registry64

適切な方法を使用してRegistryViewいますか、それともWinAPIを直接使用する必要がありますか?

4

1 に答える 1

20

私はあなたが何を求めているのか誤解しているかもしれませんが、32ビットプロセスで実行している場合は、Wow6432Node\xxxxxとにかくすべてのキーがノードにあります。したがって、それらをコピーしようとした場合HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}(および、64ビットビューを手動で指定しなかったHKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}場合)、同じ値をコピーすることになります。このコードは機能するはずです:

keyPath = @"Software\Classes\CLSID\" + clsid;
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);
// Note this calls HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}:
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree); 

var regularx64View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
// Note this calls HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}:
var regularClassKey = regularx64View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree); 
于 2013-03-15T04:24:52.257 に答える