Каковы наиболее ценные .Net Compact Framework Советы, подсказки и Gotcha-Avoiders?

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

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

Ответ 1

Конечно:

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

добавлено 5/25/10

добавлено 7/27/10

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

добавлено 11/22/11

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

Ответ 2

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

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

Ответ 3

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


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

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

dgDataGrid.DataSource = dsDataSet;

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

bsData.DataSource = dsDataSet;

dgDataGrid.DataSource = bsData;

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

Ответ 4

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

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

Остерегайтесь шифрования на SD-карте. SqlCE перестанет работать вообще. Поведение Oracle Lite под шифрованием гораздо более зловещее, так как его части работают, а части его нет.

Избегайте SQlCE RDA и репликации слияния. Это были бы фантастические инструменты, если бы они работали надежно, но они не в ситуациях, когда сетевое соединение неожиданно может быть удалено во время репликации (довольно распространенное в мире WM). Это один бит меня HARD с производственным приложением. Технология поддержки MS, с которой мы работали, наконец была вынуждена признать, что она просто не работает на 100%. Фактическая цитата: "просто продолжайте пытаться реплицировать - они в конечном итоге сольются".

Ответ 5

Как и FYI, если вы расстроены отсутствием поддержки Compact Framework в Visual Studio 2010, перейдите здесь и проголосуйте за него добавлено. (И распространять слово)

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

Ответ 6

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

Ответ 7

  • Если вы планируете использовать Sql Server 3.5 Compact, прочитайте этот блог.
  • В SQL Server Compact существуют серьезные проблемы с производительностью, а на устройстве может быть на 100 раз меньше, чем на рабочем столе, поэтому всегда проверяйте свой код базы данных на устройстве.
  • Настройка устройства и тестирование производительности/интеграции на устройстве. Также очень мало людей на самом деле делают это, это не то, что сложно и далеко завышает затраты.
  • Если вы разворачиваете свой код, все время используйте сеть вместо ActiveSync. Самый простой способ - создать на устройстве простой FTP-сервер или агент TCP.

Ответ 8

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

Правила, необходимые для минимизации Compact Framework - головные боли SqlCe.

  • Используйте одно соединение SqlCe - вы можете использовать механизм блокировки соединения, чтобы включить использование одного соединения для нескольких потоков.
  • Вложения в объемных данных медленны из-за Sqlce Engine. Используйте прямые вставки таблицы, которые имеют аналогичную производительность для записи непосредственно в текстовый файл.
  • Утилизируйте соединение SqlCe при закрытии приложения. Это гарантирует, что все ресурсы будут очищены.
  • Утилизируйте все команды, datareaders и т.д. после каждого обращения к базе данных. Использование утверждений - ваш друг. Убедитесь, что объекты считывателя находятся внутри команды, используя инструкции и т.д.

Ответ 9

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

Ответ 10

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

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

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

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

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

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

Ответ 11

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

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);
}

Ответ 12

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

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

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

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

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

Ответ 13

При выполнении чего-либо с OutlookSession всегда

  • создать экземпляр в основном (прикладном) потоке
  • выполнить против него в основном потоке (Я использую объект Control для вызова против)
  • и распоряжаться им в таймфрейм (если вы этого не сделаете, странное поведение в Pocket Outlook)

Ответ 14

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