¿Cuáles son los más valuable.Net Consejos Marco Compacto, Trucos, y Gotcha-Avoiders? [cerrado]


Trabajamos extensamente en.Net Compact Framework y Windows Mobile. He visto un montón de preguntas surgen con respecto a los detalles del desarrollo de ASP.Net aplicaciones u otras aplicaciones de escritorio basadas en. Net, pero nada específico de CF.

Alguien más un desarrollador móvil por ahí que puede compartir algunas cosas para empezar a hacer, dejar de hacer, y evitar hacer al desarrollar en el Marco Compacto?

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

14 answers

Claro:

  • Utilice un dispositivo físico siempre que sea posible (no el emulador)
  • Prueba con múltiples dispositivos (diferentes proveedores, diferentes modelos)
  • Concentrate testing around sleep / wakeup behaviors
  • Cuando use pruebas unitarias MSTEST, nunca use accesores privados
  • Evite ActiveSync como la plaga-debug usando coreCon direct
  • Familiarícese con RPM y comience a usarlo temprano
  • Reutilizar objetos cuando sea posible
  • Evite hacer mucho trabajo en ctor - off de un formulario lo carga para carga perezosa o en un hilo de fondo
  • Cargar formularios bajo demanda cuando sea posible (no todos a la vez)
  • Almacene en caché los formularios utilizados con frecuencia, cree formularios infrecuentes a pedido
  • Mantenga las resoluciones de imagen bajas
  • Si una clase expone Dispose utilícela. Siempre.
  • Ninguna aplicación es demasiado pequeña para beneficiarse de los patrones MVC/MVP
  • No use el puerto de Microsoft CAB / SCSF para el CF (las personas que lo portaron obviamente nunca usaron un dispositivo de recursos limitados)
  • Familiarícese con el concepto de "conectado ocasionalmente" si va a realizar cualquier actividad remota de datos/servicios
  • El acoplamiento y el anclaje son tu amigo y tu enemigo: prueba las rotaciones de pantalla en tiempo de ejecución y las múltiples resoluciones (incluso si crees que no las apuntarás, porque probablemente estés equivocado en ese pensamiento)
  • Mire, pero no invierta mucho en el tipo de proyecto device deployment package. Tiene limitaciones importantes que probablemente muerdan usted. Un archivo por lotes funciona sorprendentemente bien o una tarea personalizada de MSBUILD para llamar a CabWiz
  • Repase sus habilidades de C++ y P/Invoke. Usted los necesitará. Es casi imposible escribir una aplicación CF útil sin P / Invocar algo.
  • Código al mínimo común denominador para los objetivos.
  • Las clases parciales son su amigo, especialmente para dividir la lógica entre los tipos de destino (PPC, Teléfono, CE no móvil).
  • Evite ejecutar una aplicación desde almacenamiento persistente, especialmente para CE y pre-WinMo 5. Copie a la RAM y ejecute desde allí para evitar que la paginación de demanda lo mate, especialmente después de un ciclo de sueño/vigilia.
  • Las aplicaciones no deben preocuparse por las transiciones de sueño/vigilia, pero eso es pura teoría. Sleep wake * * cambiará el comportamiento de tu aplicación, así que vuelve a probar, probar, probar.
  • ¿Mencioné la prueba? ¿Especialmente en todos los dispositivos que puedas tener en tus manos? Compre hardware barato de eBay para su laboratorio de pruebas. Tener más dispositivos es más importante que tener el último a menos que tiene la intención de utilizar una característica específica de un dispositivo más nuevo.
  • Solicite la intervención divina si planea usar Bluetooth mediante programación. Familiarícese con Widcomm y Microsoft stacks y comprenda que no son lo mismo.
  • Vea el webcast de MSDN sobre la gestión de memoria en el marco Compacto. Míralo de nuevo por las cosas que te perdiste la primera vez.
  • Tenga cuidado con sleep/wake invalidando los controladores internos y causando violaciones de acceso. Esto es más esotérico pero ciertamente sucede. Por ejemplo, si ejecuta una aplicación desde una tarjeta de almacenamiento, la aplicación completa no se carga en la RAM. Las piezas en uso se solicitan para su ejecución. Todo esto está muy bien. Ahora, si apagas el dispositivo, todos los controladores se apagan. Cuando se realiza una copia de seguridad, muchos dispositivos simplemente vuelven a montar los dispositivos de almacenamiento. Cuando tu app necesita demandar-page en más programa, ya no está donde estaba y muere. Un comportamiento similar puede ocurrir con bases de datos en tiendas montadas. Si tener un identificador abierto a la base de datos, después de un ciclo de reposo/activación, el identificador de conexión puede dejar de ser válido.
  • Instale la versión de evaluación de Platform Builder. El código fuente para muchas cosas está ahí (como la interfaz de usuario de red, muchos controladores, etc.) y cuando su código P/Invoke no está haciendo lo que espera, al menos tendrá un lugar para buscar el "por qué".

Añadido 5/25/10

Añadido 7/27/10

  • Si buscas una interfaz de usuario estética, prepárate para hacer muchos dibujos personalizados o manuales.
  • Si está haciendo dibujos personalizados o manuales y necesita usar transparencia, prepárese para una carga de frustraciones y tener que escribir código loco o llamar código nativo directamente a evitar deficiencias en la CF.

Añadido 11/22/11

Simplemente estoy agregando a la lista a medida que se me ocurren...

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-22 17:21:17

OpenNETCF es un gran recurso.

Su Smart Device Framework es una necesidad real cuando se desarrolla con el. NET Compact Framework, ya que faltan muchas de las características completas del marco [Creo que alguien dijo una vez que el. NET Compact Framework es un envoltorio alrededor de 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-04 10:51:00

Esto no es específico de solo de Los dispositivos de marco compacto, sin embargo, se alza su cabeza fea mucho más cuando se desarrolla en ellos debido a las contraindicaciones de recursos que se desarrollan en una plataforma móvil.


Recientemente me encontré con un gran post como parte de un hilo sobre la gestión de fugas de memoria que me ayudó a identificar una fuga que no conocía en un error al configurar la cuadrícula de datos.DataSource en una de nuestras aplicaciones móviles.

Al vincular una cuadrícula de datos, debe no utilice directamente algo como:

dgDataGrid.DataSource = dsDataSet;

Ya que esto crea un nuevo CurrencyManager cada vez que no se elimina correctamente. En su lugar, primero desea vincular la cuadrícula de datos a una fuente de enlace para evitar la fuga de recursos.

bsData.DataSource = dsDataSet;

dgDataGrid.DataSource = bsData;

¿Quién sabía? Scott Langham lo hizo en otro post . Gracias 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:02

Si tiene que soportar múltiples tamaños/resoluciones de pantalla, la herencia de formularios es una excelente manera de hacerlo. Básicamente diseñas tu formulario para que se ajuste a la pantalla estándar de 320x240. Para admitir un tamaño de pantalla diferente, simplemente agregue un nuevo formulario, herede de su formulario personalizado (en lugar de solo Formulario) y luego reorganice los controles según sea necesario.

Otro truco útil es envolver la llamada ShowDialog de una manera que le permita establecer el título del formulario padre en "" temporalmente - esto mantiene todos los abra formularios en su aplicación para que no aparezcan en la lista de programas en ejecución. Otra forma de mejorar el wrapper es PInvoke SetForegroundWindow con el identificador de la ventana padre. Esto asegura que el padre siempre volverá a aparecer después de que el hijo esté cerrado; sin esta llamada, es posible que otras ventanas se inserten en la pila z encima del formulario padre.

Tenga cuidado con el cifrado en la tarjeta SD. SqlCE dejará de funcionar por completo. Comportamiento de Oracle Lite bajo cifrado es mucho más siniestro, ya que partes de ella funcionan y partes de ella no.

Evite SqlCE RDA y la replicación merge. Estas serían herramientas fantásticas si funcionaran de manera confiable, pero no lo hacen en situaciones en las que la conexión de red se puede perder inesperadamente durante la replicación (bastante común en el mundo WM). Este me mordió duro con una aplicación de producción. La tecnología de soporte de MS con la que tratamos finalmente se vio obligada a reconocer que simplemente no funciona al 100%. Cita real: "solo sigue tratando de replicate-they'll merge correctly eventually".

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-12 17:34:43

Para su información, si está molesto por no tener soporte para Compact Framework en Visual Studio 2010, vaya aquí y vote para que se agregue. (Y difundir la palabra)

MS ha abandonado más o menos las solicitudes de características existentes en Connect. Por favor, vaya al nuevo sitio de Voz de usuario para votar para esta función.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-23 18:19:22

La mayoría de las cosas fuera de lo común requiere llamar directamente a la API de Windows a través de P/Invoke. He encontrado http://www.pinvoke.net/ para ser un gran recurso para P / Invoke tanto en Win32 como en 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-21 21:55:53
  • Si está planeando usar Sql Server 3.5 Compact lea este blog.
  • Hay serios problemas de rendimiento en SQL Server Compact y algunos códigos pueden ser 100 veces más lentos en el dispositivo en comparación con el escritorio, por lo que siempre pruebe el código de su base de datos en el dispositivo.
  • Configuración de la unidad y pruebas de rendimiento / integración en el dispositivo. También muy pocas personas realmente hacen esto, no es tan complicado y sobrepasa los costos.
  • Si despliega su código todos los tiempo utilice la red en lugar de ActiveSync. La forma más fácil es configurar un simple servidor FTP o agente TCP en el dispositivo.
 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-16 22:59:04

Al trabajar con Compact Framework y SqlCe, puede haber muchos problemas con el rendimiento, fugas de memoria y sincronizaciones de subprocesos.

Reglas a cumplir para minimizar los dolores de cabeza de Compact Framework - SqlCe.

  1. Use una conexión SqlCe: puede usar un mecanismo de bloqueo en la conexión para habilitar el uso de una conexión en múltiples hilos.
  2. Los insertos de datos masivos son lentos debido al motor Sqlce. Utilice insertos de mesa directa, que tiene un rendimiento similar beneficio de escribir directamente en un archivo de texto.
  3. Deseche la conexión SqlCe al cerrar la aplicación. Esto asegura que todos los recursos estén limpios.
  4. Deseche todos los comandos, datareaders, etc. después de cada llamada a la base de datos. Usar declaraciones es tu amigo. Asegúrese de que los objetos del lector están dentro del comando usando instrucciones, etc...
 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-29 10:02:28

OpenNet CF vale la pena investigar - incluso la edición gratuita tiene algunas bibliotecas útiles - como FTP, funcionalidad adicional de datagrid, etc.; lo cual es muy útil ya que CF carece de muchas características de.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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-27 22:44:15

Las pruebas unitarias (TDD) son posibles en.net cf. Pero hay problemas.

Va a utilizar MSTest. No NUnit, MbUnit, XUnit.net, etc. MSTest.

Necesitará Visual Studio Professional (tan cerca como puedo decir). La forma más fácil de comenzar es hacer clic con el botón derecho en un método que le gustaría probar, luego seleccione "Crear prueba de unidad". Esto establece el proyecto de prueba para usted. Solo cree un proyecto de prueba. No le gusta tener múltiples. Simplemente haga esto para crear el proyecto y obtener todas las dependencias configuradas para usted. Luego crea tus propias clases de prueba.

Los objetos simulados podrían ser un problema. RhinoMocks, Moq y TypeMock dependen de cosas que no están disponibles en.net cf. Pex tiene un proyecto llamado Stubs que todavía estoy investigando. Pex es un proyecto de investigación de Microsoft. Usted terminará creando objetos falsos personalizados en su lugar.

Las pruebas se ejecutan en el emulador del dispositivo. Eso significa que tienen que ser desplegados. Si obtiene un error extraño cuando comienza por primera vez hasta el corredor de prueba, es probable que no tenga.net 3.5 en el emulador del dispositivo todavía. Primero implemente su proyecto y, a continuación, vuelva a ejecutar las pruebas.

En el lado no testing: Obtienes LINQ a Objetos y LINQ a XML. Ambos son un regalo del Cielo. Puede hablar con un servidor a través de WCF, pero no obtiene todos los endpoints.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-25 01:05:52

Al usar una cuadrícula de datos, puede ordenar su contenido a través de los encabezados de columna utilizando el siguiente código originalmente publicado en el blog de 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
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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-30 17:36:54
  • Usted encontrará una gran cantidad de errores y Limitaciones en.net cf. Tendrás que arreglarlos. es feo, pero no tendrás elección.

  • Terminarás escribiendo muchos controles personalizados. Como la mayoría de los controles en el marco no admiten características que son comúnmente solicitadas por los clientes. Así que es una buena práctica para crear controles personalizados para todos y cada control que utiliza desde el principio. Aunque es posible que no tenga nada en ellos cuando comience. Puedes agrega lógica personalizada más adelante. Sin tener que modificar mucho código existente.

  • Si necesita validación, puede usar . net validation framework

  • Es una buena idea para sperate su código en todas partes en su aplicación. Podrías usar el patrón MVC. Y si elige usarlo, puede obtener una ventaja utilizando MobileMVC
  • Si necesita un kit de herramientas de interfaz de usuario enriquecido, puede mirar Resco (google it).
  • VS Designer será tu arco enemigo.

Esto es todo en lo que puedo pensar ahora mismo.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-24 05:05:20

Al hacer cualquier cosa con OutlookSession, siempre

  • instanciarlo en el hilo principal (aplicación)
  • ejecutar contra él en el hilo principal (Uso un objeto de Control para invocar contra)
  • y disponer de ella dentro de un decente plazo (si no lo haces tendrás comportamiento extraño en Pocket Outlook)
 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-03 15:13:49

Cuando trabaje con Windows Mobile, si no desea que su formulario sea a pantalla completa, debe establecer el FormBorderStyle a None. Si no lo hace, pasará horas tirando de su cabello preguntándose por qué está cambiando de tamaño automáticamente al tamaño de pantalla completa (que es de hecho una característica de 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-22 03:01:30