Jakie są najbardziej valuable.Net Compact Framework Tips, Tricks, and Gotcha-Avoiders? [zamknięte]

Pracujemy szeroko w. Net Compact Framework i Windows Mobile. Widziałem wiele pytań dotyczących szczegółów rozwoju ASP.Net Aplikacje lub inne aplikacje komputerowe oparte na. Net, ale nic konkretnego CF.

Ktoś jeszcze programista mobilny, który może podzielić się kilkoma rzeczami, aby zacząć robić, przestać robić i unikać robienia podczas tworzenia w kompaktowych ramach?

Author: B. Clay Shannon, 2008-12-12

14 answers

Jasne:

  • Użyj fizycznego urządzenia, jeśli to możliwe (nie emulatora)
  • Test z wieloma urządzeniami (różnych dostawców, różnych modeli)
  • Koncentrat testowania zachowań związanych ze snem / przebudzeniem
  • podczas korzystania z testów jednostkowych MSTEST, nigdy nie używaj prywatnych accesorów
  • unikaj ActiveSync jak plaga-debug przy użyciu CoreCon direct
  • zapoznaj się z RPM i zacznij go używać wcześnie
  • Użyj ponownie obiektów, gdy jest to możliwe
  • unikaj wykonywania wielu prac w formularz ctor-off ładuje go dla leniwego ładowania lub w wątku tła
  • załaduj formularze na żądanie, jeśli to możliwe (nie wszystkie na raz)
  • buforuj często używane formularze, twórz rzadkie na żądanie
  • Zachowaj niską rozdzielczość obrazu
  • Jeśli Klasa wystawia użyj jej. Zawsze.
  • żadna aplikacja nie jest zbyt mała, aby korzystać z wzorców MVC / MVP
  • nie używaj portu Microsoft CAB / SCSF dla CF (ludzie, którzy go przeportowali, oczywiście nigdy nie używali resource-limited device)
  • zapoznaj się z pojęciem "okazjonalnie podłączony", jeśli będziesz wykonywać zdalną działalność w zakresie danych / usług
  • Dokowanie i kotwiczenie to twój przyjaciel i wróg - testuj obroty ekranu i wiele rozdzielczości (nawet jeśli myślisz, że nie będziesz ich celować, ponieważ prawdopodobnie mylisz się w tym myśleniu) {]}
  • Spójrz, ale nie inwestuj mocno w typ projektu pakietu wdrażania urządzeń. Ma poważne ograniczenia, które prawdopodobnie ugryzą ty. Plik wsadowy działa zaskakująco dobrze lub niestandardowe zadanie MSBUILD do wywołania CabWiz
  • Odśwież swoje umiejętności C++ I P / Invoke. Będziesz ich potrzebował. Prawie niemożliwe jest napisanie użytecznej aplikacji CF bez P/wywołania czegoś.
  • Kod najniższego wspólnego mianownika dla celów.
  • klasy częściowe są twoim przyjacielem, szczególnie do dzielenia logiki między typami docelowymi (PPC, Phone, non-mobile CE).
  • unikaj uruchamiania aplikacji z pamięci trwałej, zwłaszcza dla CE i pre-WInMo 5. Skopiuj do pamięci RAM i uruchom stamtąd, aby zapobiec wywołaniu żądań, szczególnie po cyklu uśpienia/czuwania.
  • aplikacje nie powinny przejmować się przejściami snu/czuwania, ale to czysta teoria. Sen wake * * będzie * zmienić zachowanie aplikacji, więc ponownie test, test, test.
  • Czy wspomniałem o teście? Zwłaszcza na każdym urządzeniu, które możesz dostać w swoje ręce? Kup tani sprzęt z eBay do laboratorium testowego. Posiadanie większej liczby urządzeń jest ważniejsze niż posiadanie najnowszych, chyba że zamierzasz korzystać z określonej funkcji nowszego urządzenia. Poproś o boską interwencję, jeśli planujesz używać bluetooth programowo. Zapoznaj się ze stosami Widcomm i Microsoft i zrozum, że nie są takie same.
  • Obejrzyj webcast MSDN na temat zarządzania pamięcią w kompaktowym frameworku. Obejrzyj jeszcze raz to, co przegapiłeś za pierwszym razem.
  • Uważaj na uśpienie / budzenie unieważniające wewnętrzne Uchwyty i powodujące naruszenia dostępu. To jest bardziej Ezoteryczne, ale to się zdarza. Na przykład, jeśli uruchamiasz aplikację z karty pamięci, cała aplikacja nie jest ładowana do pamięci RAM. Elementy w użyciu są żądane do wykonania. Wszystko jest dobrze i dobrze. Jeśli wyłączysz urządzenie, wszystkie sterowniki zostaną wyłączone. Po włączeniu zasilania wiele urządzeń po prostu ponownie montuje urządzenia pamięci masowej. Gdy Twoja aplikacja musi żądać-strona w programie więcej, to nie jest już tam, gdzie było i umiera. Podobne zachowanie może mieć miejsce w przypadku baz danych na zamontowanych sklepach. Jeśli mieć otwarty uchwyt do bazy danych, po cyklu usypiania/budzenia uchwyt połączenia może nie być już ważny.
  • Zainstaluj wersję testową Platform Builder . Kod źródłowy dla wielu rzeczy jest tam (jak interfejs sieciowy, wiele sterowników itp.) i kiedy twój kod P/Invoke nie robi tego, czego oczekujesz, będziesz miał przynajmniej miejsce, aby poszukać "dlaczego".

Dodano 5/25/10

Dodano 7/27/10

  • Jeśli szukasz estetycznego interfejsu użytkownika, przygotuj się na wiele rysunków niestandardowych lub ręcznych.
  • jeśli wykonujesz rysunek niestandardowy lub ręczny i potrzebujesz użyć przezroczystości, przygotuj się na obciążenie frustracji i konieczność napisania zwariowanego kodu lub wywołania natywny kod bezpośrednio do obejść niedociągnięcia w por.

Dodano 11/22/11

  • nie zakładaj, że tylko dlatego, że przestrzeń nazw lub klasa istnieje w BCL, to jest faktycznie zaimplementowana w jakikolwiek użyteczny sposób. certyfikaty na pewno nie są .

Po prostu dodaję do listy tak, jak mi się wydaje...

 120
Author: ctacke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-22 17:21:17

OpenNETCF jest świetnym zasobem.

Ich Smart Device Framework jest prawdziwym must have podczas tworzenia Z. NET Compact Framework, ponieważ tak wiele pełnych funkcji framework brakuje [myślę, że ktoś kiedyś powiedział. NET Compact Framework jest owijką wokół NotImplementedException!]

 13
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-04 10:51:00

Nie jest to specyficzne dlaTylko Compact Framework devices, jednak sprawia, że jest to brzydka Głowa o wiele bardziej podczas tworzenia na nich ze względu na kontrainty zasobów rozwijające się na platformie mobilnej.


Ostatnio natknąłem się na świetny post jako część wątku o zarządzaniu wyciekami pamięci, który pomógł mi zidentyfikować wyciek, o którym nie wiedziałem w błędzie podczas ustawiania DataGrid.DataSource w jednej z naszych aplikacji mobilnych.

Podczas wiązania DataGrid, należy NIE bezpośrednio użyj czegoś w stylu:

dgDataGrid.DataSource = dsDataSet;

Ponieważ tworzy to za każdym razem nowy CurrencyManager, który nie zostanie prawidłowo usunięty. Zamiast tego chcesz najpierw powiązać DataGrid z BindingSource, aby uniknąć wycieku zasobów.

bsData.DataSource = dsDataSet;

dgDataGrid.DataSource = bsData;
Kto by pomyślał? Scott Langham zrobił w kolejny post . Dzięki Scott!
 11
Author: Mat Nadrofsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:02

Jeśli musisz obsługiwać wiele rozmiarów ekranu/rozdzielczości, dziedziczenie formularzy jest doskonałym sposobem na to. Zasadniczo projektujesz swój formularz tak, aby pasował do standardowego ekranu 320x240. Aby obsługiwać inny rozmiar ekranu, wystarczy dodać nowy formularz, dziedziczyć z niestandardowego formularza (zamiast tylko formularza), a następnie ponownie rozmieścić kontrolki w razie potrzeby.

Innym przydatnym trikiem jest zawinięcie wywołania ShowDialog w sposób, który pozwala tymczasowo ustawić podpis formularza nadrzędnego na "" - to utrzymuje wszystkie otwórz formularze w aplikacji od pojawienia się na liście uruchomionych programów. Innym sposobem ulepszenia owijki jest przypiąć SetForegroundWindow za pomocą uchwytu okna nadrzędnego. Zapewnia to, że rodzic zawsze pojawi się ponownie po zamknięciu potomka; bez tego wywołania możliwe jest wstawianie innych okien do stosu z nad formą rodzica.

Uważaj na szyfrowanie na karcie SD. SqlCE przestanie działać. Zachowanie Oracle Lite pod szyfrowaniem jest znacznie bardziej złowrogi, ponieważ część działa, a część nie.

Unikaj SQLCE RDA i replikacji merge. Byłyby to fantastyczne narzędzia, gdyby działały niezawodnie, ale nie w sytuacjach, w których połączenie sieciowe może zostać nieoczekiwanie przerwane podczas replikacji (dość powszechne w świecie WM). Ten ugryzł mnie mocno z aplikacją produkcyjną. Technologia wsparcia MS, z którą mieliśmy do czynienia, była w końcu zmuszona przyznać, że po prostu nie działa w 100%. Cytat: "po prostu próbuj dalej replikować-w końcu połączą się poprawnie".

 7
Author: MusiGenesis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-12 17:34:43

Tak dla twojej wiadomości, Jeśli jesteś zdenerwowany brakiem obsługi Compact Framework w Visual Studio 2010, przejdź tutaj i zagłosuj na dodanie.

MS ma mniej lub bardziej porzucone istniejące żądania funkcji w Connect. Przejdź do nowej strony głosowej , aby zagłosować na tę funkcję.

 7
Author: Vaccano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-23 18:19:22

Większość nietypowych rzeczy wymaga bezpośredniego wywołania Windows API przez P / Invoke. Znalazłem http://www.pinvoke.net / być świetnym zasobem dla P / Invoke zarówno na Win32 jak i Windows CE.

 6
Author: Martin Liesén,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-21 21:55:53
  • jeśli planujesz korzystać z SQL Server 3.5 Compact przeczytaj Ten blog.
  • istnieją poważne problemy z wydajnością w SQL Server Compact i niektóre kody mogą być 100 razy wolniejsze na urządzeniu w porównaniu do pulpitu, więc zawsze testuj kod bazy danych na urządzeniu.
  • jednostka konfiguracji i testowanie wydajności / integracji na urządzeniu. Również bardzo niewielu ludzi rzeczywiście to zrobić, to nie jest tak skomplikowane i znacznie zawyża koszty.
  • Jeśli wdrożysz swój kod wszystkie czas Użyj sieci zamiast ActiveSync. Najprostszym sposobem jest skonfigurowanie prostego serwera FTP lub agenta TCP na urządzeniu.
 4
Author: ollifant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-16 22:59:04

Pracując z Compact Framework i SqlCe, może wystąpić wiele problemów z wydajnością, wyciekami pamięci i synchronizacją wątków.

Zasady, których należy przestrzegać, aby zminimalizować zwarty Framework - SQLCE.

  1. Użyj jednego połączenia SqlCe - możesz użyć mechanizmu blokującego na połączeniu, aby umożliwić użycie jednego połączenia na wielu wątkach.
  2. masowe wstawianie danych jest powolne ze względu na silnik Sqlce. Użyj bezpośrednich wkładek stołowych, które mają podobną wydajność korzyści z zapisu bezpośrednio do pliku tekstowego.
  3. Usuń połączenie SqlCe po zamknięciu aplikacji. To zapewnia, że wszystkie zasoby są oczyszczone.
  4. pozbywa się wszystkich poleceń, datareaderów itp. Po każdym wywołaniu bazy danych. Korzystanie z oświadczeń jest twoim przyjacielem. Upewnij się, że obiekty reader znajdują się wewnątrz polecenia używając poleceń itd...
 4
Author: sharky101,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-29 10:02:28

Warto przyjrzeć się OPENNET CF - nawet darmowa edycja ma kilka przydatnych bibliotek-takich jak FTP, dodatkowe funkcje datagrid itp., co jest bardzo pomocne, ponieważ CF nie ma wielu funkcji. NET framework.

 3
Author: sarsnake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 22:44:15

Testowanie jednostkowe (TDD) jest możliwe na.Net cf. Ale są pewne problemy.

Będziesz używać MSTest. Nie NUnit, MBUnit, XUnit.net, itd. MSTest.

Będziesz potrzebował Visual Studio Professional (tak blisko, jak mogę powiedzieć). Najprostszym sposobem na rozpoczęcie pracy jest kliknięcie prawym przyciskiem myszy metody, którą chcesz przetestować, a następnie wybranie opcji "Utwórz test jednostkowy". To tworzy projekt testowy dla Ciebie. Utwórz tylko jeden projekt testowy. Nie lubi mieć wielu. Wystarczy to zrobić, aby stworzyć projekt i uzyskać wszystkie ustawienia zależności dla Ciebie. Następnie stwórz własne klasy testowe.

Mock obiekty mogą być problemem. RhinoMocks, Moq i TypeMock wszystko zależy od rzeczy, które nie są dostępne w. Net cf. Pex ma projekt o nazwie Stubs, którego wciąż szukam. Pex jest projektem badawczym firmy Microsoft. Zamiast tego będziesz tworzyć niestandardowe fałszywe obiekty.

Testy są uruchamiane na emulatorze urządzenia. To znaczy, że muszą być rozmieszczone. Jeśli przy pierwszym uruchomieniu pojawi się dziwny błąd w górę biegacza testowego, prawdopodobnie nie masz. NET 3.5 na emulatorze Urządzenia jeszcze. Najpierw wdroż projekt, a następnie uruchom testy ponownie.

Po stronie nietestowej: Dostajesz LINQ do obiektów i LINQ do XML. Oba są darem niebios. Możesz rozmawiać z serwerem przez WCF, ale nie masz wszystkich punktów końcowych.

 3
Author: Chris Brandsma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-25 01:05:52

Używając DataGrid możesz posortować jego zawartość poprzez nagłówki kolumn, używając następującego kodu oryginalnie opublikowanego na blogu Chrisa Craft ' a :

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
Author: Mat Nadrofsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-30 17:36:54
  • W. Net CF napotkasz wiele błędów i ograniczeń. Trzeba będzie małpa łatać je. jest brzydki, ale nie będziesz miał wyboru.

  • Skończysz pisząc wiele niestandardowych kontrolek. Ponieważ większość kontrolek w ramach nie obsługuje funkcji, które są często wymagane przez klientów. Tak więc dobrą praktyką jest tworzenie niestandardowych kontrolek dla każdej kontroli, której używasz od samego początku. Nawet jeśli możesz nic w nich nie mieć, kiedy zaczniesz. Możesz dodaj niestandardową logikę później. Bez konieczności modyfikowania dużej ilości istniejącego kodu.

  • Jeśli potrzebujesz walidacji, możesz użyć . NET validation framework

  • to dobry pomysł, aby rozpowszechniać swój kod wszędzie w aplikacji. Możesz użyć wzorca MVC. A jeśli zdecydujesz się go użyć, możesz uzyskać przewagę, używając MobileMVC
  • Jeśli potrzebujesz bogatego zestawu narzędzi UI, możesz zajrzeć do Resco (google it).
  • VS Designer będzie twoim łukiem wróg.
Tylko o tym teraz myślę.
 2
Author: thekindofme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-24 05:05:20

Podczas robienia czegokolwiek z OutlookSession, zawsze

  • Utwórz instancję w głównym wątku (aplikacji)
  • Wykonaj na nim na głównym wątku (Do wywołania używam obiektu Control przeciw)
  • i pozbądź się go w przyzwoitym ramy czasowe (jeśli nie będziesz miał dziwne zachowanie w kieszonkowym Outlooku)
 1
Author: PhilChuang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-03 15:13:49

Podczas pracy z Windows Mobile, jeśli nie chcesz, aby twój formularz był pełnoekranowy, musisz ustawić FormBorderStyle na None. Jeśli tego nie zrobisz, będziesz spędzać godziny na wyciąganiu włosów zastanawiając się, dlaczego automatycznie zmienia rozmiar na Pełny ekran (co jest w rzeczywistości Funkcja z Windows Mobile)

 1
Author: James Hulse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-22 03:01:30