.net - para - net framework 3.5 offline windows 10
¿Cuáles son los más valiosos consejos, trucos y métodos de eliminación de.Net Compact Framework? (14)
Al hacer cualquier cosa con OutlookSession, siempre
- instanciarlo en el hilo principal (aplicación)
- ejecutar contra él en el hilo principal (utilizo un objeto Control para invocar)
- y deséchelo dentro de un marco de tiempo decente (si no lo hace, tendrá un comportamiento extraño en Pocket Outlook)
Trabajamos extensamente en .Net Compact Framework y Windows Mobile. He visto muchas preguntas sobre aspectos específicos del desarrollo de aplicaciones ASP.Net u otras aplicaciones de escritorio basadas en .Net, pero nada específico de CF.
¿Alguien más un desarrollador de dispositivos móviles que pueda compartir algunas cosas para empezar a hacer, dejar de hacer y evitar hacerlo al desarrollar en el Framework Compacto?
Al trabajar con Compact Framework y SqlCe, puede haber muchos problemas con el rendimiento, las pérdidas de memoria y las sincronizaciones de subprocesos.
Reglas a seguir para minimizar Compact Framework - SqlCe dolores de cabeza.
- Use una conexión SqlCe: puede usar un mecanismo de bloqueo en la conexión para habilitar el uso de una conexión en varios hilos.
- Las inserciones de datos masivos son lentas debido al motor Sqlce. Utilice inserciones de tabla directa, que tiene un beneficio de rendimiento similar al de escribir directamente en un archivo de texto.
- Deseche la conexión SqlCe al cerrar la aplicación. Esto asegura que todos los recursos estén limpios.
- Elimine todos los comandos, lectores de datos, etc. después de cada llamada a la base de datos. El uso de declaraciones es tu amigo. Asegúrese de que los objetos del lector estén dentro del comando usando declaraciones, etc ...
Al trabajar con Windows Mobile, si no desea que su formulario sea de pantalla completa, debe configurar el FormBorderStyle en None . Si no lo hace, pasará horas extrayéndose el pelo 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)
Al usar un DataGrid puede ordenar su contenido a través de los encabezados de las columnas mediante el siguiente código publicado originalmente 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);
}
Esto no es específico solo para los dispositivos Compact Framework, sin embargo, se vuelve mucho más desagradable cuando se desarrollan debido a limitaciones de recursos que se desarrollan en una plataforma móvil.
Recientemente me encontré con una gran publicación como parte de un hilo sobre la administración de fugas de memoria que me ayudó a identificar una fuga que no conocía en un error al configurar el DataGrid.DataSource en una de nuestras aplicaciones móviles.
Al vincular un DataGrid, no debería usar directamente algo como:
dgDataGrid.DataSource = dsDataSet;
Como esto crea un nuevo CurrencyManager cada vez que no se eliminan adecuadamente. En su lugar, desea vincular el DataGrid a un BindingSource primero para evitar la pérdida de recursos.
bsData.DataSource = dsDataSet;
dgDataGrid.DataSource = bsData;
¿Quien sabe? Scott Langham lo hizo en otra publicación . Gracias Scott!
La mayoría de las cosas ordinarias requieren una llamada directa a la API de Windows a través de P / Invoke. He encontrado que http://www.pinvoke.net/ es un gran recurso para P / Invoke en Win32 y Windows CE.
La prueba unitaria (TDD) es posible en .net cf. Pero hay problemas.
Estarás usando MSTest. No NUnit, MBUnit, XUnit.net, etc. MSTest.
Necesitarás Visual Studio Professional (lo más cerca que puedo ver). La forma más fácil de comenzar es haciendo clic derecho en un método que le gustaría probar, luego seleccione "Crear prueba de unidad". Esto configura el proyecto de prueba para usted. Solo crea 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 falsos pueden 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 buscando. Pex es un proyecto de Microsoft Research. Usted terminará creando objetos falsos personalizados en su lugar.
La prueba se ejecuta en el emulador del dispositivo. Eso significa que tienen que ser desplegados. Si obtiene un error extraño cuando inicia por primera vez el corrector de prueba, probablemente todavía no tenga .net 3.5 en el emulador del dispositivo. Primero implemente su proyecto, luego ejecute las pruebas nuevamente.
En el lado sin pruebas: Obtienes LINQ to Objects y LINQ to XML. Ambos son un regalo del cielo. Puede hablar con un servidor a través de WCF, pero no obtiene todos los puntos finales.
Por supuesto:
- Use un dispositivo físico siempre que sea posible (no el emulador)
- Prueba con múltiples dispositivos (diferentes proveedores, diferentes modelos)
- Concentrar las pruebas en torno a los comportamientos de sueño / despertar
- Al usar las pruebas de la unidad MSTEST, nunca use accesadores privados
- Evite ActiveSync como la peste: depuración con CoreCon directo
- Familiarícese con RPM y comience a usarlo temprano
- Reutiliza objetos cuando sea posible
- Evite hacer mucho trabajo en el teclado de un formulario; desactívelo para carga lenta o en un hilo de fondo.
- Cargar formularios a pedido cuando sea posible (no todos a la vez)
- Guarde en caché los formularios más utilizados, cree menos frecuentes a pedido
- Mantenga bajas las resoluciones de imagen
- Si una clase expone a Dispose, úsalo. Siempre.
- Ninguna aplicación es demasiado pequeña para beneficiarse de los patrones MVC / MVP
- No use el puerto Microsoft CAB / SCSF para el CF (las personas que lo portaron obviamente nunca usaron un dispositivo con recursos limitados)
- Familiarícese con el concepto de "conectado ocasionalmente" si va a realizar cualquier actividad remota de datos / servicio
- Docking y Anchoring son tu amigo y tu enemigo: prueba rotaciones en la pantalla en tiempo de ejecución y múltiples resoluciones (incluso si crees que no las enfocarás, porque probablemente estés equivocado en ese pensamiento)
- Mire, pero no invierta mucho en el tipo de proyecto del paquete de implementación del dispositivo. Tiene grandes limitaciones que probablemente te morderán. Un archivo por lotes funciona sorprendentemente bien o una tarea personalizada de MSBUILD para llamar a CabWiz
- Mejora tus habilidades en C ++ y P / Invoke. Los necesitarás Es casi imposible escribir una aplicación CF útil sin P / Invocar algo.
- Codifique el mínimo común denominador para los objetivos.
- Las clases parciales son su amigo, especialmente para dividir la lógica entre tipos de objetivos (PPC, teléfono, CE no móvil).
- Evite ejecutar una aplicación de almacenamiento persistente, especialmente para CE y pre-WInMo 5. Copie en la RAM y ejecútelo desde allí para evitar que la búsqueda de demanda lo mate, especialmente después de un ciclo de suspensión / activación.
- Las aplicaciones no deberían preocuparse por las transiciones sueño / vigilia, pero eso es pura teoría. Sleep wake ** * cambiará el comportamiento de su aplicación, por lo tanto, vuelva a probar, probar, probar.
- ¿Mencioné la prueba? ¿Especialmente en cada dispositivo que puedes tener en tus manos? Compre hardware barato de eBay para su laboratorio de pruebas. Tener más dispositivos es más importante que tener los últimos, a menos que pretenda usar una característica específica de un dispositivo más nuevo.
- Pida intervención divina si planea usar bluetooth programáticamente. Familiarícese con las pilas de Widcomm y Microsoft y comprenda que no son lo mismo.
- Vea el webcast de MSDN sobre la administración de la memoria en Compact Framework. Míralo nuevamente por las cosas que te perdiste la primera vez.
- Tenga cuidado con el estado de inactividad / activación que invalida los identificadores internos y ocasiona violaciones de acceso. Esto es más esotérico, pero ciertamente sucede. Por ejemplo, si está ejecutando una aplicación fuera de una tarjeta de almacenamiento, toda la aplicación no se carga en la memoria RAM. Las piezas en uso tienen una paginación de demanda para su ejecución. Esto está todo bien. Ahora, si apaga el dispositivo, todos los controladores se apagan. Cuando se vuelve a encender, muchos dispositivos simplemente vuelven a montar los dispositivos de almacenamiento. Cuando su aplicación necesita una página de demanda en más programas, ya no está donde estaba y muere. Un comportamiento similar puede ocurrir con bases de datos en tiendas montadas. Si tiene un controlador abierto para la base de datos, después de un ciclo de suspensión / 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 un montón de cosas está ahí (como la interfaz de usuario de la red, muchos controladores, etc.) y cuando su código P / Invoke no está haciendo lo que espera, al menos tendrá un lugar donde buscar el "por qué".
agregado 25/5/10
- No espere que las API de administración de energía en WinMo funcionen de forma consistente o adecuada (o incluso en absoluto) en todos los dispositivos. De hecho, incluso con el mismo hardware podría cambiar de la compilación del sistema operativo a la compilación del sistema operativo.
agregado 27/07/10
- Si buscas una interfaz de usuario estética, prepárate para hacer un montón de dibujo personalizado o manual.
- Si está haciendo un dibujo personalizado o manual y necesita usar transparencias, prepárese para un montón de frustrations y tenga que escribir códigos extraños o llamar directamente al código nativo para solucionar las shortcomings en el CF.
agregado 22/11/11
- No suponga que solo porque existe un espacio de nombres o clase en el BCL que en realidad se implementa de alguna manera útil. Los certificados ciertamente no lo son .
Simplemente estoy agregando a la lista cuando se me ocurren ...
Si tiene que admitir múltiples tamaños de pantalla / resoluciones, la herencia de formularios es una excelente manera de hacerlo. Básicamente, usted diseña su formulario para que se ajuste a la pantalla estándar de 320x240. Para admitir un tamaño de pantalla diferente, simplemente agrega un nuevo formulario, hereda de su formulario personalizado (en lugar de simplemente Formulario) y luego reorganice los controles según sea necesario.
Otro truco útil es ajustar la llamada a ShowDialog de manera que le permita establecer el título del formulario principal en "" temporalmente: esto evita que todos los formularios abiertos en su aplicación aparezcan en la lista de programas en ejecución. Otra forma de mejorar el contenedor es presionar SetForegroundWindow con el control de la ventana principal. Esto asegura que el padre siempre volverá a aparecer después de que el niño se cierre; sin esta llamada, es posible que se inserten otras ventanas en el z-stack sobre el formulario principal.
Tenga cuidado con el cifrado en la tarjeta SD. SqlCE dejará de funcionar por completo. El comportamiento de Oracle Lite bajo cifrado es mucho más siniestro, ya que algunas partes funcionan y otras no.
Evite SqlCE RDA y fusione la replicación. Estas serían herramientas fantásticas si funcionasen de manera confiable, pero no en situaciones en las que la conexión de red puede abandonarse inesperadamente durante la replicación (bastante común en el mundo de WM). Este me mordió DIFÍCILMENTE 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: "simplemente sigue tratando de replicar, se fusionarán correctamente eventualmente".
Solo como un FYI, si está molesto por no tener compatibilidad con Compact Framework en Visual Studio 2010, vaya here y vote para que se agregue. (Y difunda la palabra)
MS ha abandonado más o menos solicitudes de funciones existentes en Connect. Vaya al nuevo sitio de User Voice para votar esta función.
Vale la pena investigar sobre OpenNet CF, incluso la edición gratuita tiene algunas librerías útiles, como FTP, la funcionalidad adicional de la cuadrícula de datos, etc. que es muy útil ya que CF carece de muchas características de .NET Framework.
OpenNETCF es un gran recurso.
Su Smart Device Framework es una herramienta imprescindible cuando se desarrolla con el .NET Compact Framework, ya que faltan muchas de las características del Framework completo [¡Creo que alguien dijo una vez que .NET Compact Framework es un envoltorio alrededor de NotImplementedException!]
- Si planea 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, así que siempre pruebe el código de su base de datos en el dispositivo.
- Unidad de configuración y prueba de rendimiento / integración en el dispositivo. Además, muy pocas personas realmente hacen esto, no es tan complicado y supera con creces los costos.
- Si despliega su código todo el tiempo, use la red en lugar de ActiveSync. La forma más fácil es configurar un simple servidor FTP o agente TCP en el dispositivo.
Encontrarás muchos errores y limitaciones en .net cf. Tendrás que parchearlos. es feo pero no tendrás elección.
Terminará escribiendo muchos controles personalizados. Como la mayoría de los controles en el marco no son compatibles con las características que comúnmente solicitan los clientes. Por lo tanto, es una buena práctica crear controles personalizados para cada uno de los controles que utiliza desde el principio. Aunque es posible que no tengas nada en ellos cuando comiences. Puede agregar lógica personalizada más adelante. Sin tener que modificar una gran cantidad de código existente.
Si necesita validación, puede usar el marco de validación .net
- Es una buena idea clasificar tu código en todas partes en tu aplicación. Podría usar el patrón MVC. Y si decide usarlo, puede obtener ventaja con el uso de MobileMVC
- Si necesita un kit de herramientas de interfaz de usuario rico, puede mirar Resco (google it).
- VS Designer será tu archienemigo.
Esto es todo lo que puedo pensar en este momento.