Каковы наиболее ценные советы, приемы и рекомендации по работе с .Net Compact Framework?

Мы активно работаем с .Net Compact Framework и Windows Mobile. Я видел множество вопросов, касающихся специфики разработки приложений ASP.Net или других настольных приложений на основе .Net, но ничего конкретного по поводу CF.

Кто-нибудь еще из мобильных разработчиков, который может поделиться некоторыми вещами, которые нужно начать делать, прекратить делать и чего не делать при разработке в Compact Framework?


person Mat Nadrofsky    schedule 12.12.2008    source источник
comment
Закрыт как неконструктивный, но имеет 56 апиков и 93 звезды; это напоминает мне бестолкового кота, который велел Элвису вернуться к вождению грузовика.   -  person B. Clay Shannon    schedule 11.12.2013
comment
@ B.ClayShannon: обратите внимание на дату этого вопроса. Стандарты Stack Overflow изменились за пять лет.   -  person John Saunders    schedule 11.12.2013
comment
То есть, три года это был хороший вопрос, а потом выяснилось, что он даже неконструктивный? Судя по популярности и качеству принятого ответа, мне трудно это понять. Вопрос вызвал очень достойный ответ (проголосовало более ста раз!), И поэтому вопрос был и остается явно конструктивным.   -  person B. Clay Shannon    schedule 11.12.2013
comment
@ B.ClayShannon: это означает, что раньше это считалось хорошим вопросом, когда Stack Overflow был очень молодым. Но мы учились на своих ошибках и не прочь их исправить.   -  person John Saunders    schedule 02.01.2014
comment
Что ж, если это ваш сайт, вы можете делать все, что хотите, но достаточно таких бессмысленных ходов, и люди уйдут прочь.   -  person B. Clay Shannon    schedule 02.01.2014


Ответы (14)


Конечно:

  • По возможности используйте физическое устройство (не эмулятор)
  • Тестируйте на нескольких устройствах (разные поставщики, разные модели)
  • Сосредоточьте тестирование на поведении во сне / пробуждении
  • При использовании модульных тестов MSTEST никогда не используйте частные аксессоры
  • Избегайте ActiveSync как чумы - отлаживайте напрямую с помощью CoreCon
  • Ознакомьтесь с RPM и начните использовать его как можно раньше
  • По возможности используйте объекты повторно
  • Избегайте большой работы в ctor формы - отключите ее для отложенной загрузки или в фоновом потоке
  • Загружать формы по запросу, когда это возможно (не все сразу)
  • Кешируйте часто используемые формы, создавайте нечастые по запросу
  • Сохраняйте низкое разрешение изображений
  • Если класс предоставляет Dispose, используйте его. Всегда.
  • Ни одно приложение не является слишком маленьким, чтобы использовать шаблоны MVC / MVP
  • Не используйте порт Microsoft CAB / SCSF для CF (люди, которые его портировали, очевидно, никогда не использовали устройства с ограниченными ресурсами)
  • Ознакомьтесь с концепцией «периодически подключаемого», если вы собираетесь выполнять какие-либо удаленные операции с данными / услугами.
  • Стыковка и привязка - ваш друг и ваш враг - протестируйте вращение экрана во время выполнения и несколько разрешений (даже если вы думаете, что не будете нацеливаться на них, потому что, вероятно, вы ошибаетесь в этом мышлении)
  • Посмотрите на тип проекта пакета развертывания устройства, но не вкладывайте в него больших средств. У него есть серьезные ограничения, которые могут вас укусить. На удивление хорошо работает командный файл или настраиваемая задача MSBUILD для вызова CabWiz.
  • Освежите свои навыки C ++ и P / Invoke. Они вам понадобятся. Практически невозможно написать полезное приложение CF без P / Invoking чего-либо.
  • Кодируйте с наименьшим общим знаменателем для целей.
  • Частичные классы - ваш друг, особенно для разделения логики между целевыми типами (PPC, Phone, немобильный CE).
  • Избегайте запуска приложений из постоянного хранилища, особенно для CE и до WInMo 5. Скопируйте в RAM и запускайте оттуда, чтобы не допустить, чтобы подкачка по запросу вас убила, особенно после цикла сна / пробуждения.
  • Приложения не должны заботиться о переходах между режимами сна и бодрствования, но это чистая теория. Пробуждение во сне ** изменит * поведение вашего приложения, так что снова тестируйте, тестируйте, тестируйте.
  • Я упоминал тест? Особенно на каждом устройстве, которое попадется вам в руки? Купите дешевое оборудование на eBay для своей тестовой лаборатории. Наличие большего количества устройств важнее, чем наличие последней версии, если вы не собираетесь использовать определенную функцию нового устройства.
  • Просите божественного вмешательства, если планируете программно использовать блютуз. Познакомьтесь со стеками Widcomm и Microsoft и поймите, что это не одно и то же.
  • Посмотрите веб-трансляцию MSDN об управлении памятью в Compact Framework. Посмотрите его еще раз, чтобы увидеть то, что вы пропустили в первый раз.
  • Следите за тем, чтобы режим сна / бодрствования не делал внутренние дескрипторы недействительными и не приводил к нарушениям доступа. Это более эзотерически, но, безусловно, случается. Например, если вы запускаете приложение с карты памяти, все приложение не загружается в оперативную память. Используемые детали выгружаются для исполнения. Это все хорошо. Теперь, если вы выключите устройство, все драйверы отключатся. При резервном питании многие устройства просто повторно монтируют запоминающие устройства. Когда вашему приложению требуется запросить страницу в дополнительной программе, она перестает быть там, где была, и умирает. Аналогичное поведение может произойти с базами данных на подключенных хранилищах. Если у вас есть открытый дескриптор базы данных, после цикла сна / пробуждения дескриптор соединения может стать недействительным.
  • Установите ознакомительную версию Platform Builder . Исходный код для множества вещей находится там (например, сетевой интерфейс, многие драйверы и т. "Зачем".

добавлено 25.05.10

добавлено 27.07.10

  • Если вам нужен эстетичный пользовательский интерфейс, будьте готовы делать много пользовательских или ручных рисунков.
  • Если вы рисуете вручную или вручную и вам необходимо использовать прозрачность, приготовьтесь к загрузке разочарование и необходимость писать дурацкий код или вызовите собственный код непосредственно на работать недостатки в CF.

добавлено 22.11.11

  • Не думайте, что только потому, что пространство имен или класс существует в BCL, они фактически реализованы каким-либо полезным образом. Конечно, сертификатов нет.

Я просто добавляю в список по мере того, как они приходят мне в голову ...

person ctacke    schedule 12.12.2008
comment
Без сомнения, отличный старт! Спасибо за ответ. Какой порт / пакет вы используете / рекомендуете для CF? - person Mat Nadrofsky; 12.12.2008
comment
Что ж, я, очевидно, буду рекомендовать Smart Device Framework. Я могу быть сильно предвзятым, но он используется десятками тысяч, поэтому он должен иметь разумную стоимость. - person ctacke; 12.12.2008
comment
Все отлично, кроме кеширования часто используемых форм. Я обнаружил, что это больше проблем, чем того стоит. - person MusiGenesis; 12.12.2008
comment
Основываясь на личном опыте в большинстве из этих областей, я бы хотел дать этому минимум +5. А то, что вы уже знаете о .NET, в целом будет почти верным в CE. - person dkretz; 12.12.2008
comment
@ctacke: мне было интересно, видели ли вы этот мой вопрос: stackoverflow.com/questions/300607/ - person MusiGenesis; 13.12.2008
comment
Я предполагаю, что вы уже сталкивались с этой проблемой раньше. :) - person MusiGenesis; 13.12.2008
comment
О, это гениальный пост. LMAO @ комментарий SCSF. О, и я также рекомендую Smart Device Framework, и я не предвзято. - person Quibblesome; 19.12.2008
comment
CoreCon - это не объект. CoreCon - это транспортный уровень, который Studio использует для «разговора» с подключенным устройством. - person ctacke; 30.04.2009
comment
Крис, отличный список. Можете ли вы указать какие-либо инструкции о том, как Избегать ActiveSync как чумы - отлаживать с помощью прямой работы CoreCon? У моей команды много проблем с ActiveSync, но мы не видим, как CoreCon помогает нам без ActiveSync. - person Eric Farr; 24.06.2009
comment
@Eric Farr: См. Это: msdn.microsoft.com/en-us/library /ms228708.aspx. Конечно, это предполагает, что у вас есть какие-то возможности подключения, такие как Ethernet. - person ctacke; 24.06.2009
comment
RPM - это удаленный монитор исполнения. - person ctacke; 03.12.2009
comment
RPM - еще одна загадка; Я только что придумал итальянские рестораны и дискуссии об оборотах в минуту (там может быть связь *, если посмотреть, как часто итальянцы меняют свое правительство). * Никакой каламбур - person B. Clay Shannon; 11.12.2013
comment
Это удаленный монитор производительности. Часть PowerToys IIRC. - person ctacke; 11.12.2013
comment
Как можно скопировать в ОЗУ и запустить оттуда (я имею в виду программно, что, как я полагаю, вы имеете в виду)? - person B. Clay Shannon; 11.12.2013
comment
ОЗУ не находится в подключенном хранилище файлов (например, '\ Storage Card', '\ SDMMC' или что-то еще) - person ctacke; 12.12.2013

OpenNETCF - отличный ресурс.

Их Smart Device Framework действительно необходим при разработке с .NET Compact Framework, так как многие из функций Full framework отсутствуют [я думаю, кто-то однажды сказал, что .NET Compact Framework - это оболочка вокруг NotImplementedException!]

person Mitch Wheat    schedule 17.01.2009
comment
В подавляющем большинстве случаев, если вы разрабатываете что-то без использования OpenNETCF, вы, вероятно, делаете это неправильно! :) - person Quibblesome; 19.01.2009
comment
Еще одна вещь, которую я бы предостерегал, используя версию 1.4 - ей уже несколько лет (3 IIRC?), И с тех пор мы внесли много изменений и исправлений ошибок. - person ctacke; 19.01.2009
comment
@ctacke: ура, я обновился (не знаю, как мне удалось вставить такую ​​старую ссылку!) - person Mitch Wheat; 04.05.2009

Это не относится только к только устройствам Compact Framework, однако при разработке на них возникает гораздо больше уродливой головы из-за нехватки ресурсов, разрабатываемых на мобильной платформе.


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

При привязке DataGrid вы не должны не напрямую использовать что-то вроде:

dgDataGrid.DataSource = dsDataSet;

Поскольку при этом каждый раз создается новый CurrencyManager, который не удаляется должным образом. Вместо этого вы хотите сначала привязать DataGrid к BindingSource, чтобы избежать утечки ресурсов.

bsData.DataSource = dsDataSet;

dgDataGrid.DataSource = bsData;

Кто знал? Скотт Лэнгхэм сделал это в другом посте. Спасибо, Скотт!

person Mat Nadrofsky    schedule 12.12.2008
comment
+1, потому что отрицать чей-то ответ на свой вопрос просто неправильно. - person MusiGenesis; 12.12.2008
comment
Мне было интересно по поводу отрицательного голоса ... есть ли небольшая ценность в том, что я опубликовал, по вашему мнению, или это просто неправильная тема для меня, чтобы упоминать об этом, потому что это не специфично для .Net CF ... не уверен. Я знаю, что это была проблема в нашем мобильном приложении, которая усугублялась тем фактом, что она была на мобильном устройстве. - person Mat Nadrofsky; 12.12.2008
comment
Нет, ваш пост был очень ценным. Понятия не имею, почему кто-то проголосовал против этого, если только они не думали, что вы не должны отвечать на свои собственные вопросы, что неверно. - person MusiGenesis; 13.12.2008

Если вам необходимо поддерживать несколько размеров / разрешений экрана, наследование форм - отличный способ сделать это. В основном вы разрабатываете свою форму, чтобы она соответствовала стандартному экрану 320x240. Чтобы поддерживать другой размер экрана, вы просто добавляете новую форму, наследуете от своей настраиваемой формы (а не только от формы), а затем при необходимости меняете расположение элементов управления.

Еще один полезный трюк - обернуть вызов ShowDialog таким образом, чтобы вы могли временно установить для заголовка родительской формы значение «» - это предотвращает отображение всех открытых форм в вашем приложении в списке запущенных программ. Другой способ улучшить оболочку - это PInvoke SetForegroundWindow с дескриптором родительского окна. Это гарантирует, что родитель всегда будет снова появляться после закрытия дочернего элемента; без этого вызова другие окна могут быть вставлены в z-стек над родительской формой.

Следите за шифрованием на SD-карте. SqlCE вообще перестанет работать. Поведение Oracle Lite при шифровании гораздо более зловещее, поскольку некоторые из них работают, а некоторые - нет.

Избегайте SqlCE RDA и репликации слиянием. Это были бы фантастические инструменты, если бы они работали надежно, но этого не произойдет в ситуациях, когда сетевое соединение может неожиданно прерваться во время репликации (довольно часто в мире WM). Этот укусил меня СЛОЖНО с производственным приложением. Служба поддержки MS, с которой мы имели дело, наконец-то была вынуждена признать, что она просто не работает на 100%. Актуальная цитата: «просто продолжайте пытаться воспроизвести - в конечном итоге они правильно сольются».

person MusiGenesis    schedule 12.12.2008
comment
Спасибо за советы. Здесь есть несколько замечательных моментов! Мы точно собирались держаться подальше от RDA в этом проекте. Кроме того, мы написали наш собственный менеджер форм, чтобы мы могли отправлять и извлекать формы из нашего собственного стека, который, похоже, пока работает, и принимает во внимание ваш совет. :) - person Mat Nadrofsky; 01.02.2009
comment
Я бы посоветовал начать с поддержки 240x240 в качестве минимального разрешения, хотя есть еще несколько wm-устройств, у которых оно есть. - person Joel; 16.05.2009
comment
@ Джоэл: хорошая мысль. Я бы не хотел злить обоих этих парней! - person MusiGenesis; 26.02.2010

Для большинства необычных вещей требуется прямой вызов Windows API через P / Invoke. Я обнаружил, что http://www.pinvoke.net/ является отличным ресурсом для P / Invoke на обоих Win32 и Windows CE.

person Martin Liesén    schedule 21.01.2009

Так же, как и к сведению, если вы расстроены тем, что в Visual Studio 2010 нет поддержки Compact Framework, перейдите на здесь и проголосуйте за его добавление. (и распространите информацию)

MS более или менее отказалась от существующих запросов функций в Connect. Перейдите на новый User Voice проголосует за эту функцию.

person Vaccano    schedule 27.09.2010
comment
+1 - Ура. Неплохой совет, придерживайтесь VS2008, если вам нравится .Net CF - person Mat Nadrofsky; 28.09.2010

  • Если вы планируете использовать Sql Server 3.5 Compact, прочтите этот блог.
  • SQL Server Compact имеет серьезные проблемы с производительностью, и некоторый код может быть в 100 раз медленнее на устройстве по сравнению с настольным компьютером, поэтому всегда проверяйте код своей базы данных на устройстве.
  • Настройка модуля и тестирование производительности / интеграции на устройстве. Кроме того, очень немногие люди на самом деле это делают, это не так сложно и намного перевешивает затраты.
  • Если вы все время развертываете свой код, используйте сеть вместо ActiveSync. Самый простой способ - настроить на устройстве простой FTP-сервер или TCP-агент.
person ollifant    schedule 16.02.2009
comment
Нашим решением для использования SQLCE было использование SQLite. :) - person Mat Nadrofsky; 30.03.2009

При работе с Compact Framework и SqlCe может возникнуть множество проблем с производительностью, утечками памяти и синхронизацией потоков.

Правила, которых следует придерживаться, чтобы свести к минимуму Compact Framework - головную боль SqlCe.

  1. Используйте одно соединение SqlCe - вы можете использовать механизм блокировки в соединении, чтобы разрешить использование одного соединения в нескольких потоках.
  2. Массовые вставки данных выполняются медленно из-за Sqlce Engine. Используйте прямую вставку таблицы, что дает такой же выигрыш в производительности, как и запись непосредственно в текстовый файл.
  3. Удалите соединение SqlCe при закрытии приложения. Это гарантирует, что все ресурсы очищены.
  4. Удаляйте все команды, носители данных и т. Д. После каждого обращения к базе данных. Использование утверждений - ваш друг. Убедитесь, что объекты-читатели находятся внутри команды, используя операторы и т. Д.
person sharky101    schedule 29.12.2010
comment
BulkInsert с использованием библиотеки ErikEJ выполняется быстро. См. sqlcebulkcopy.codeplex.com. - person B. Clay Shannon; 11.12.2013

Стоит изучить OpenNet CF - даже в бесплатной версии есть несколько полезных библиотек, таких как FTP, дополнительные функции datagrid и т. Д .; что очень полезно, поскольку CF не хватает многих функций .net framework.

person sarsnake    schedule 27.01.2009
comment
Готов поспорить, ctacke согласен. :) Спасибо за ответ! - person Mat Nadrofsky; 01.02.2009

Модульное тестирование (TDD) возможно в .net cf. Но есть проблемы.

Вы будете использовать MSTest. Не NUnit, MBUnit, XUnit.net и т. Д. MSTest.

Вам понадобится Visual Studio Professional (насколько я могу судить). Самый простой способ начать - щелкнуть правой кнопкой мыши метод, который вы хотите протестировать, и выбрать «Создать модульный тест». Это настроит для вас тестовый проект. Создайте только один тестовый проект. Не нравится иметь несколько. Просто сделайте это, чтобы создать проект и настроить все зависимости за вас. Затем создайте свои собственные тестовые классы.

Поддельные объекты могут быть проблемой. RhinoMocks, Moq и TypeMock зависят от вещей, которые недоступны в .net cf. У Pex есть проект под названием Stubs, над которым я все еще изучаю. Pex - это исследовательский проект Microsoft. Вместо этого вы в конечном итоге создадите собственные поддельные объекты.

Тест выполняется на эмуляторе устройства. Это означает, что они должны быть развернуты. Если вы получаете странную ошибку при первом запуске средства запуска тестов, вероятно, у вас еще нет .net 3.5 в эмуляторе устройства. Сначала разверните свой проект, затем снова запустите тесты.

На стороне, не связанной с тестированием: вы получаете LINQ to Objects и LINQ to XML. Оба являются находкой. Вы можете общаться с сервером через WCF, но вы не получаете все конечные точки.

person Chris Brandsma    schedule 25.04.2009
comment
+1 - Привет, спасибо за вопрос-ответ. Мы приближаемся к этапу вопросов и ответов по крупному новому мобильному предложению, и подобные ссылки помогут в этом, в нашем первом испытании на выпуске продукта Windows Mobile. - person Mat Nadrofsky; 30.04.2009
comment
Вы можете поместить проект обычного модульного тестирования в проект компактного фреймворка (смарт-устройства). VS выдает пугающее предупреждение, но после этого все идет гладко. - person Vaccano; 29.09.2010

При использовании DataGrid вы можете сортировать его содержимое по заголовкам столбцов, используя исходный следующий код: опубликовано в блоге Криса Крафта:

using System.Windows.Forms;
using System.Data;

public static void SortDataGrid(object sender, System.Windows.Forms.MouseEventArgs e)
{
   DataGrid.HitTestInfo hitTest;
   DataTable dataTable;
   DataView dataView;
   string columnName;
   DataGrid dataGrid;

   // Use only left mouse button clicks.
   if (e.Button == MouseButtons.Left)
   {
   // Set dataGrid equal to the object that called this event handler.
   dataGrid = (DataGrid)sender;

   // Perform a hit test to determine where the mousedown event occured.
   hitTest = dataGrid.HitTest(e.X, e.Y);

   // If the MouseDown event occured on a column header,
   // then perform the sorting operation.
   if (hitTest.Type == DataGrid.HitTestType.ColumnHeader)
   {
      // Get the DataTable associated with this datagrid.
      dataTable = (DataTable)dataGrid.DataSource;

      // Get the DataView associated with the DataTable.
      dataView = dataTable.DefaultView;

      // Get the name of the column that was clicked.
      if(dataGrid.TableStyles.Count != 0)
         columnName = dataGrid.TableStyles[0].GridColumnStyles[hitTest.Column].MappingName;
      else
         columnName = dataTable.Columns[hitTest.Column].ColumnName;

      // If the sort property of the DataView is already the current
      // column name, sort that column in descending order.
      // Otherwise, sort on the column name.
      if (dataView.Sort == columnName)
         dataView.Sort = columnName + " DESC";
      else
         dataView.Sort = columnName;
      }
   }
}

private void dgDataGrid_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
   if(dgDataGrid.VisibleRowCount == 0) return;
   SortDataGrid(sender, e);
   dgDataGrid.Select(dgDataGrid.CurrentRowIndex);
}
person Mat Nadrofsky    schedule 30.03.2009
comment
На самом деле оригинал принадлежит Алексу Фейнману: alexfeinman.com/download.asp?doc = GridDemo.zip - person ctacke; 31.03.2009

  • Вы столкнетесь с множеством ошибок и ограничений в .net cf. Вам придется их обезьянам залатать. это уродливо, но у тебя не будет выбора.

  • В конечном итоге вы напишете множество настраиваемых элементов управления. Поскольку большинство элементов управления в структуре не поддерживают функции, которые обычно запрашиваются клиентами. Поэтому рекомендуется с самого начала создавать настраиваемые элементы управления для каждого элемента управления, который вы используете. Даже если у вас может и не быть в них ничего, когда вы начнете. Позже вы можете добавить собственную логику. Без изменения большого количества существующего кода.

  • Если вам нужна проверка, вы можете использовать структуру проверки .net

  • Хорошая идея - разместить код повсюду в вашем приложении. Вы можете использовать шаблон MVC. И если вы решите использовать его, вы можете начать работу с помощью MobileMVC.
  • Если вам нужен богатый набор инструментов пользовательского интерфейса, вы можете посмотреть Resco (погуглить).
  • VS Designer будет вашим заклятым врагом.

Это все, о чем я могу думать прямо сейчас.

person thekindofme    schedule 24.06.2010

При выполнении каких-либо действий с OutlookSession всегда

  • создать его в основном (приложении) потоке
  • выполнить против него в основном потоке (я использую объект Control для вызова)
  • и утилизируйте его в приемлемые сроки (в противном случае у вас будет странное поведение в Pocket Outlook)
person PhilChuang    schedule 03.02.2009

При работе с Windows Mobile, если вы не хотите, чтобы ваша форма отображалась в полноэкранном режиме, вам необходимо установить для FormBorderStyle значение Нет. Если вы этого не сделаете, вы потратите часы, выдергивая волосы, недоумевая, почему они автоматически меняют размер до полноэкранного размера (что на самом деле является функцией Windows Mobile).

person James Hulse    schedule 22.09.2010
comment
Ага. Waaaay еще с 2004 года: blog.opennetcf.com/ctacke/2004/02 / 02 / - person ctacke; 22.09.2010
comment
Это актуально только для CF 2.0 или Windows Mobile 6? Я могу отредактировать свой ответ, чтобы отразить это. - person James Hulse; 22.09.2010
comment
Это актуально для всех платформ WinMo, независимо от языка (вы получаете такое же поведение с приложением C ++). - person ctacke; 22.09.2010