RegistryKey изменен с новым форматом csproj - PullRequest
0 голосов
/ 06 февраля 2020

Для одного из наших проектов я изменил формат csproj, чтобы подготовиться к миграции. net Core. В настоящее время мы используем. net Framework 4.8.

Я ничего не изменил в коде, но после этого произошла ошибка, и приложение больше не могло найти раздел реестра. Оба раза приложение было отлажено в Debug с AnyCPU на одной и той же 64-битной машине.

string registry_key32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
    var subKeys = key.GetSubKeyNames();
}

Это возвращает ~ 400 ключей до изменения, затем оно возвращает только ~ 200.

Почему результат вызова этого метода изменился при переходе от старого формата csproj к новому?

1 Ответ

0 голосов
/ 06 февраля 2020

Я не могу сказать вам, почему это изменилось, но кажется, что правила компиляции ядра. net используются с новым форматом csproj. Таким образом, эта проблема также будет возникать при переходе с. net Framework на. net Ядро, как это уже было задано здесь Поиск ключей реестра, выдающих различные выходные данные. net ядро ​​и. net фреймворк .

Скомпилировано для "x86":

Always 32-bit
On 32-bit platforms, accesses 32-bit registry
On 64-bit platforms, accesses 32-bit registry (inside Wow6432Node)

Скомпилировано для "x64":

Always 64 bit
On 32-bit platforms, won't run
On 64-bit platforms, accesses 64-bit registry (not inside Wow6432Node)

. NET Приложение скомпилировано для "AnyCpu"

Either 32 or 64 bit depending on platform
On 32-bit platforms, accesses 32-bit registry
On 64-bit platforms, accesses 64-bit registry (not inside Wow6432Node)

Короче говоря, решение заключалось в том, чтобы также жестко проверять код на 64-битных ключах реестра.

string registry_key32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
    var subKeys = key.GetSubKeyNames();
}

string registry_key64 = @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
    var subKeys = key.GetSubKeyNames();
}
...