Windows CE удаляет .NET CF при перезагрузке - PullRequest
7 голосов
/ 08 декабря 2008

Я пишу приложение на C # для проприетарного устройства Windows CE 4.2 (для которого у меня нет спецификаций или какой-либо другой информации. У меня есть доступ к файловой системе, и это в основном все). ) Я также не могу получить поддержку от оригинального производителя.

Теперь я могу отлично установить .NET Compact Framework, и все работает некоторое время. Но время от времени, когда устройство перезагружается, оно удаляет каркас, GAC, все, что с ним связано.

Я знаю, что это не просто аппаратный сброс с возвратом к заводским настройкам, потому что:

  1. Он запоминает параметры реестра (если я пытаюсь установить снова, он говорит, что фреймворк уже установлен, и спрашивает, не хочу ли я переустановить. Поэтому, очевидно, ключи реестра все еще там)
  2. Файлы удаляются, даже если я установил фреймворк на съемную флеш-карту. (Однако другие файлы на карте памяти остаются одни)

Я знаю, что дальше особо нечего делать, но, возможно, какой-нибудь гуру Windows CE сможет рассказать мне, почему это происходит, и если есть какой-то разумный способ избежать этого. Я мало что знаю о Windows CE, поэтому, насколько я знаю, это может быть совершенно стандартное поведение.

В этом отношении, какой-нибудь совет относительно того, как решить эту проблему самостоятельно? На данный момент лучшее решение, которое я вижу, это просто переустанавливать все при каждой загрузке, но это кажется немного неуклюжим.

Edit: GACLOG.TXT, найденный в корне файловой системы, после сброса содержит

CGACUTIL: Инициализация 12/08/2008

20: 43: 57.000 CGACUTIL: инициализировано

12/08/2008 20: 43: 57.000 CGACUTIL:

Удаление Microsoft .NET CF 3.5.GAC

12/08/2008 20: 43: 57.000 CGACUTIL: Выполнено

12/08/2008 20: 43: 57.000 CGACUTIL:

Выход 12/08/2008 20: 43: 57.000

Так что да, это определенно удаляет GAC. Хотя почему и как это остановить?

Ответы [ 5 ]

12 голосов
/ 09 декабря 2008

Здесь вы видите несколько вариантов поведения Windows CE и CF, которые дают вам такое поведение. К сожалению, нет действительно хорошего решения, но я могу, по крайней мере, дать вам некоторые рекомендации.

  1. Windows CE хранит текущее хранилище объектов, включая файлы в файловой системе, а не в постоянном хранилище в ОЗУ. Это включает в себя любые файлы и / или папки, добавленные в папку \ Windows (это ключ в вашем случае). При потере питания устройства - как правило, при программном или аппаратном сбросе, эти данные теряются.
  2. Реестр CE может (и, вероятно, находится на вашем устройстве) храниться в постоянном хранилище. Это может быть в файловой системе (в виде куста) или в каком-то невидимом месте (есть два отличных способа, которыми OEM может хранить его). Это не потеряно при сбросе. Только сохраненные и не очищенные элементы будут потеряны.
  3. В качестве дополнения к # 2 - изменения реестра сбрасываются при вызове API RegFlushKey. Установка CAB автоматически вызывает это (так делает установка CF). Некоторые OEM-производители также предпочитают, чтобы он работал на периодическом таймере.
  4. Когда CF GAC отображает элементы, отсутствующие на изображении, файл перемещается в папку \ Windows. Они возвращаются , когда сборка выгружена (я жаловался команде CF на это несколько лет назад безрезультатно).

Это означает, что если вы установите CF на карту памяти и запустите свое приложение, это произойдет:

  1. Файлы CF копируются в постоянное хранилище во время распаковки CAB
  2. При установке рег ключи написаны
  3. Реестр сбрасывается (сохраняется)
  4. Приложение работает
  5. Файлы CF перемещаются (не копируются) в \ Windows, что является нестабильным.

Теперь, если вы перезагрузите устройство во время загрузки CF-сборок - пуф! не более CF. Ваше приложение было на карте памяти, но не в GAC, поэтому оно сохраняется, но больше не может работать.

Хакерское решение: используйте нативное приложение для "начальной загрузки", чтобы запустить ваше приложение. Пусть он проверит наличие файлов CF в \ Windows при запуске и, если их там нет, установите CF CAB из места в постоянном хранилище (пометьте его как доступный только для чтения, чтобы wceload не удалил его).

Другой вариант - распространять сборки CF вместе с вашим приложением, а не GAC.

1 голос
/ 07 января 2013

Я знаю, что это очень старый вопрос, но, поскольку у меня была та же проблема, что и упомянутая в вопросе, я провёл много исследований, чтобы заставить ее работать. И мне удалось сделать это без использования родного приложения начальной загрузки.

1) Я использовал MSCEInf для предварительного извлечения кабины CF. Я скопировал извлеченные данные (которые содержат папку \ Windows) и оригинальную кабину на SD-карте и вставил их в устройство после полной загрузки.

2) Теперь сначала установите кабину, выберите пустую папку (создайте ее, если необходимо) на той же SD-карте или в другом хранилище NAND.

3) Скопируйте содержимое папки \ Windows, которую вы извлекли из кабины CF ранее, в ту же папку, где вы установили CF. Если появится запрос на перезапись любых файлов, всегда выбирайте «Нет».

4) Убедитесь, что все приложения, которые используют / нуждаются в CF, находятся внутри этой же папки. Вы также можете разместить там любые вложенные папки, принадлежащие приложению.

В любом случае, это сработало для меня. Приложения продолжают работать, даже после перезагрузки.

Надеюсь, это поможет!

0 голосов
/ 09 января 2015

Я провел мозговой штурм в течение нескольких часов и, наконец, начал писать руководство пользователя для конфигурации устройств HW на основе WinCE 7 и создания проекта. Будет доступно в ближайшее время. Спасибо ТАК за участие в моем исследовании

0 голосов
/ 26 октября 2011

На моем DataLogic Memor CE теперь я могу заставить новую .Net-установку пережить холодную загрузку, сохранив вручную «сессию» (что бы это ни значило). Находится здесь:
Start | Settings | Control Panel | Files Admin | Save session
(Диалоговое окно остается открытым после нажатия кнопки «Сохранить сессию», но вы можете просто закрыть это диалоговое окно.)

Это (очевидно) все еще требует ручного действия, так что это просто еще один обходной путь.
Подать заявку быстрее всего на несколько устройств (во время разработки / опробования), но дополнительный установочный файл или хак-код ctacke, вероятно, лучше для больших томов.

Это также означает, что есть способ сделать новую .Net-установку постоянной с помощью программного обеспечения. Так, может быть, кто-то может быть спровоцирован, чтобы выяснить, как это сделать, и поделиться этим с миром?

PS: я не знаю, насколько обобщенно это ручное сохранение (если оно применимо к другим устройствам или другим брендам или другим версиям CE). Также я не знаю, является ли чистая загрузка постоянной.

0 голосов
/ 08 декабря 2008

Я думаю, вам нужно запустить RegSave, чтобы сохранить настройки реестра после установки чего-либо. Я должен был сделать это в более старой (до .Net) версии Windows CE.

...