Какие советы, хитрости и хитрости избегают.Net Compact Framework?

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

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

14 ответов

Решение

Конечно:

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

добавлено 25.05.10

добавлено 27.07.10

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

добавлено 22.11.11

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

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

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

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

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


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

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

dgDataGrid.DataSource = dsDataSet;

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

bsData.DataSource = dsDataSet;

dgDataGrid.DataSource = bsData;

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

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

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

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

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

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

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

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

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

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

  1. Используйте одно соединение SqlCe - вы можете использовать механизм блокировки для соединения, чтобы разрешить использование одного соединения в нескольких потоках.
  2. Массовая вставка данных происходит медленно из-за Sqlce Engine. Используйте прямую вставку таблиц, которая дает аналогичный выигрыш в производительности при записи непосредственно в текстовый файл.
  3. Удалите соединение SqlCe при закрытии приложения. Это гарантирует, что все ресурсы очищены.
  4. Утилизируйте все команды, устройства чтения данных и т. Д. После каждого обращения к базе данных. Используя заявления, ваш друг. Убедитесь, что объекты читателя находятся внутри команды, используя операторы и т.д...
  • Если вы планируете использовать Sql Server 3.5 Compact, прочтите этот блог.
  • В SQL Server Compact существуют серьезные проблемы с производительностью, и некоторый код может быть в 100 раз медленнее на устройстве по сравнению с рабочим столом, поэтому всегда проверяйте код своей базы данных на устройстве.
  • Настройка устройства и тестирование производительности / интеграции на устройстве. Кроме того, очень немногие на самом деле делают это, это не так сложно и значительно перевешивает затраты.
  • Если вы развертываете свой код все время, используйте сеть вместо ActiveSync. Самый простой способ - настроить простой FTP-сервер или TCP-агент на устройстве.

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

Вы будете использовать 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, но вы не получаете все конечные точки.

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

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

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

  • Если вам нужна валидация, вы можете использовать .net validation framework

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

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

При использовании 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);
}

При работе с OutlookSession всегда

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

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

Другие вопросы по тегам