Windows CE Hive Registy очистка подключа - PullRequest
2 голосов
/ 28 февраля 2012

Я занимаюсь разработкой с использованием устройства WinCE 5.

Я сохраняю изменения в реестре на основе кустов, который находится на постоянном носителе. Мои ключи находятся под HKLM \ Softare \ AppName. HKLM \ RegPersisted = 1 для справки.

Я считаю, что даже если я вызываю Flush () для моего подраздела (из Compact Framework), изменение не сохраняется, если я сразу выключаю его.

Аналогично, если я позвоню

Microsoft.Win32.Registry.LocalMachine.Flush();

Я получаю тот же результат.

Однако, если я позвоню

[DllImport("coredll.dll", EntryPoint = "RegFlushKey", SetLastError = true)]
public static extern uint RegFlushKey(uint hKey);

с UINT для HKLM, то изменение действительно сохраняется, если я выключаю сразу после.

Есть идеи, что обычные версии .Net не работают? Или, возможно, они работают, но по какой-то причине это ленивый сброс, тогда как прямая версия coredll не ленивая?

Спасибо.

1 Ответ

1 голос
/ 29 февраля 2012

Использование Reflector в mscoree (расположенном на C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\Debugger\BCL) для Compact Framework показывает, что вызов RegistryKey.Flush просто заканчивается здесь:

[DllImport("mscoree", EntryPoint="#481")]
public static extern int FlushKey(IntPtr hRootKey);

На этом этапе он переходит в скомпилированный собственный код, так чтомы не можем проследить это дальше.Можно подумать, что mscoree просто вызовет RegFlushKey для вас, но ваши тесты (я не проверял результаты) показывают, что он делает что-то еще.Единственный обходной путь, о котором я могу подумать, это ручная очистка через P / Invoke.

Вы уверены , что управляемый только код никогда не сохраняет изменения, новерсия p / invoke всегда делает?

...