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

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

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

12.12.2008 15:54:46
Закрытый как неконструктивный, но он имеет 56 uptics и 93 звезды; это напоминает мне о невежественном коте, который велел Элвису вернуться к вождению грузовика.
B. Clay Shannon 11.12.2013 17:06:11
@ B.ClayShannon: обратите внимание на дату этого вопроса. Стандарты переполнения стека изменились за пять лет.
John Saunders 11.12.2013 17:26:13
То есть, что - это был хороший вопрос в течение трех лет, а затем было решено, что он даже не был конструктивным? Исходя из популярности и качества принятого ответа, мне сложно это понять. Этот вопрос вызвал очень достойный ответ (проголосовал более ста раз!), И, таким образом, вопрос был и остается явно конструктивным.
B. Clay Shannon 11.12.2013 17:31:59
@ B.ClayShannon: это означает, что раньше это считалось хорошим вопросом, еще когда Stack Overflow было очень молодым. Но мы учились на своих ошибках и не против их исправить.
John Saunders 2.01.2014 02:08:58
Ну, если это ваш сайт, вы можете делать то, что вы хотите, но достаточно глупых ходов, как это, и люди уйдут.
B. Clay Shannon 2.01.2014 16:11:08
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, они фактически реализованы любым полезным способом. Сертификаты, конечно, нет .

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

120
22.11.2011 17:21:17
Отличное начало, без сомнения! Спасибо за ответ. Какой порт / пакет вы используете / рекомендуете для CF?
Mat Nadrofsky 12.12.2008 16:14:50
Ну, я, очевидно, собираюсь рекомендовать Smart Device Framework. Я могу быть сильно предвзятым, но его используют десятки тысяч, поэтому он должен иметь разумное значение.
ctacke 12.12.2008 16:17:35
Все отлично, кроме кеширования часто используемых форм. Я обнаружил, что это больше проблем, чем оно того стоит.
MusiGenesis 12.12.2008 16:44:52
Основываясь на личном опыте в большинстве из этих областей, я хотел бы дать это по крайней мере +5. И то, что вы уже знаете о .NET, в целом окажется почти верным в CE.
dkretz 12.12.2008 17:54:16
CoreCon не является объектом. CoreCon - это транспортный уровень, который Studio использует для «разговора» с подключенным устройством.
ctacke 30.04.2009 15:27:24

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


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

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

dgDataGrid.DataSource = dsDataSet;

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

bsData.DataSource = dsDataSet;

dgDataGrid.DataSource = bsData;

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

11
23.05.2017 12:25:02
+1, потому что просто неправильно принижать чей-то ответ на свой вопрос.
MusiGenesis 12.12.2008 17:25:48
Я задавался вопросом о понижении голосов ... мало ли в том, что я написал, по вашему мнению, или это просто неправильная тема для меня, чтобы упомянуть об этом, потому что это не .Net CF специфично ... не уверен. Я знаю, что это была проблема в нашем мобильном приложении и подчеркивается тем, что оно было на мобильном устройстве.
Mat Nadrofsky 12.12.2008 19:48:33
Нет, ваш пост был очень ценным. Понятия не имею, почему кто-то проголосовал бы за него, если только они не думали, что вы не должны отвечать на свои вопросы, что неправильно.
MusiGenesis 12.12.2008 21:05:51

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

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

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

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

7
12.12.2008 17:34:43
Спасибо за советы. Некоторые замечательные моменты, сделанные здесь! Мы собирались держаться подальше от RDA в этом проекте наверняка. Кроме того, мы написали наш собственный менеджер форм, чтобы мы могли выталкивать и извлекать формы из нашего собственного стека, который, кажется, работает до сих пор и учитывает ваши рекомендации. :)
Mat Nadrofsky 1.02.2009 13:33:16
Я бы посоветовал начать с поддержки 240x240 в качестве минимального разрешения, где есть еще несколько устройств wm, которые имеют его.
Joel 15.05.2009 21:10:06
@ Джоэл: хорошая мысль. Я не хотел бы , чтобы разозлить как эти ребята!
MusiGenesis 25.02.2010 21:26:07

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

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

13
4.05.2009 10:51:00
В подавляющем большинстве случаев, если вы разрабатываете без каких-либо действий с OpenNETCF, вы, вероятно, делаете это неправильно! :)
Quibblesome 19.01.2009 11:42:19
Во-первых, я бы хотел предупредить об этом, используя версию 1.4 - ей уже несколько лет (3 IIRC?), И с тех пор мы внесли много изменений и исправлений.
ctacke 19.01.2009 20:16:24
@ctacke: ура, я обновился (не уверен, как мне удалось вставить такую ​​старую ссылку!)
Mitch Wheat 4.05.2009 10:51:30

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

7
21.01.2009 21:55:53

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

3
27.01.2009 22:44:15
Бьюсь об заклад, Ctacke согласен. :) Спасибо за ответ!
Mat Nadrofsky 1.02.2009 13:30:49

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

  • создать экземпляр в главном потоке (приложения)
  • выполнить против него в главном потоке (я использую объект Control для вызова)
  • и распорядиться им в течение приемлемого периода времени (если вы этого не сделаете, у вас будет странное поведение в Pocket Outlook)
1
3.02.2009 15:13:49
  • Если вы планируете использовать Sql Server 3.5 Compact, прочтите этот блог .
  • В SQL Server Compact существуют серьезные проблемы с производительностью, и некоторый код может быть в 100 раз медленнее на устройстве по сравнению с рабочим столом, поэтому всегда проверяйте код своей базы данных на устройстве.
  • Настройка устройства и тестирование производительности / интеграции на устройстве. Также очень немногие люди на самом деле делают это, это не так сложно и намного перевешивает затраты.
  • Если вы все время развертываете свой код, используйте вместо ActiveSync сеть. Самый простой способ - настроить на устройстве простой FTP-сервер или агент TCP.
4
16.02.2009 22:59:04
Нашим «решением» использования SQLCE было использование SQLite. :)
Mat Nadrofsky 30.03.2009 17:31:57

При использовании 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);
}
2
30.03.2009 17:36:54
На самом деле оригинал принадлежит Алексу Фейнману
ctacke 30.03.2009 21:59:04

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

3
25.04.2009 01:05:52
+1 - Эй, спасибо за уклон Q / A. Мы приближаемся к фазе вопросов и ответов по новому крупному предложению для мобильных устройств, и подобные ссылки помогут в этом, мы впервые столкнулись с трудностями при поставке продукта для Windows Mobile.
Mat Nadrofsky 29.04.2009 21:42:42
Вы можете поместить обычный проект модульного тестирования в модуль модульного тестирования (Smart Device). VS дает вам страшное предупреждение, но после этого все идет гладко.
Vaccano 28.09.2010 20:39:39
  • Вы встретите много ошибок и ограничений в .net cf. Вам придется обезьяна залатать их. это уродливо, но у вас не будет выбора.

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

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

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

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

2
24.06.2010 05:05:20

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

1
22.09.2010 03:01:30
Ага. Ваааа назад с 2004 года: blog.opennetcf.com/ctacke/2004/02/02/…
ctacke 22.09.2010 03:08:17
Это относится только к CF 2.0 или Windows Mobile 6? Я могу отредактировать свой ответ, чтобы отразить это.
James Hulse 22.09.2010 03:26:19
Это относится ко всем платформам WinMo, независимо от языка (вы получаете такое же поведение с приложением C ++).
ctacke 22.09.2010 14:15:14

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

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

7
23.09.2011 18:19:22
+1 - Yikes. Неплохой совет, «придерживайтесь VS2008, если вы в .Net CF»
Mat Nadrofsky 28.09.2010 14:00:42

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

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

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