deployment - ¿Por qué mi aplicación CE se niega a ejecutar?
compact-framework windows-ce (2)
¿Puedes intentar ejecutarlo dentro del depurador y comprobar dónde falla? ¿Puedes colocar un punto de interrupción justo al comienzo de Program.main y verificar si se alcanzó? La salida de depuración también puede darle algunos consejos interesantes.
He estado manteniendo una aplicación de Windows CE desde hace un tiempo (más de un año) y he producido nuevas versiones de vez en cuando, copiándolas en los dispositivos de mano y ejecutando las nuevas versiones allí.
Hoy, sin embargo, creé una nueva aplicación de Windows CE por primera vez. Es una utilidad muy simple.
Para crearlo en VS 2008, seleccioné una plantilla de C # "Smart Device Project", añadí algunos controles y un poco de código, y lo construí.
Estas son algunas de las opciones que seleccioné:
Copié el .exe producido al construir el proyecto en la carpeta Archivos de programa del dispositivo portátil:
... pero no se ejecutará. ¿Está en el lugar equivocado? ¿Necesita copiar algunos archivos auxiliares? ¿Hay algún otro tipo de configuración que deba hacer para que se ejecute? ¿O que?
ACTUALIZAR
Como no hay mucho, estoy pegando TODO el código siguiente en caso de que alguien crea que mi código podría ser el problema:
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace PrinterCommanderCE
{
public partial class PrinterCommanderForm : Form
{
public PrinterCommanderForm()
{
InitializeComponent();
}
private void btnSendCommands_Click(object sender, EventArgs e)
{
SendPrinterCommands();
}
private void SendPrinterCommands()
{
bool successfulSend = false;
const string quote = "/"";
string keepPrinterOn = string.Format("! U1 setvar {0}power.dtr_power_off{0} {0}off{0}", quote);
string shutPrinterOff = string.Format("! U1 setvar {0}power.dtr_power_off{0} {0}on{0}", quote);
string advanceToBlackBar = string.Format("! U1 setvar {0}media.sense_mode{0} {0}bar{0}", quote);
string advanceToGap = string.Format("! U1 setvar {0}media.sense_mode{0} {0}gap{0}", quote);
if (radbtnBar.Checked)
{
successfulSend = SendCommandToPrinter(advanceToBlackBar);
}
else if (radbtnGap.Checked)
{
successfulSend = SendCommandToPrinter(advanceToGap);
}
if (successfulSend)
{
MessageBox.Show("label type command successfully sent");
}
else
{
MessageBox.Show("label type command NOT successfully sent");
}
if (ckbxPreventShutoff.Checked)
{
successfulSend = SendCommandToPrinter(keepPrinterOn);
}
else
{
successfulSend = SendCommandToPrinter(shutPrinterOff);
}
if (successfulSend)
{
MessageBox.Show("print shutoff command successfully sent");
}
else
{
MessageBox.Show("print shutoff command NOT successfully sent");
}
}
private bool SendCommandToPrinter(string cmd)
{
bool success = false;
try
{
SerialPort serialPort = new SerialPort();
serialPort.BaudRate = 19200;
serialPort.Handshake = Handshake.XOnXOff;
serialPort.Open();
serialPort.Write(cmd);
serialPort.Close();
success = true;
}
catch
{
success = false;
}
return success;
}
}
}
ACTUALIZACIÓN 2
En base a esto , agregué un manejador de excepción global a la aplicación para que Program.cs sea ahora:
namespace PrinterCommanderCE
{
static class Program
{
[MTAThread]
static void Main()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(GlobalExceptionHandler);
Application.Run(new PrinterCommanderForm());
}
static void GlobalExceptionHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception)args.ExceptionObject;
MessageBox.Show(string.Format("GlobalExceptionHandler caught : {0}", e.Message));
}
}
}
Sin embargo, ejecutar la nueva compilación no muestra nada, simplemente "parpadea" momentáneamente con tanta verborrea como Lee Harvey Oswald después de la visita amistosa de Jack Ruby.
ACTUALIZACIÓN 3
¿Podría el problema estar relacionado con esto y, de ser así, cómo resolverlo?
La circunstancia de que tanto mi versión actualizada de una aplicación existente como esta nueva y sencilla aplicación se nieguen a ejecutarse indican que hay algo fundamentalmente defectuoso en algún punto del proceso de codificación, construcción o implementación.
ACTUALIZACIÓN 4
Como esta es una utilidad mínima, la razón por la que esta aplicación (y mi legado, mucho más complicado) no funciona puede tener algo que ver con las propiedades del proyecto, cómo se está creando, si no se ha copiado un archivo necesario o ... ???
NOTA: El ícono del escritorio es "genérico" (se ve como un formulario blanco en blanco); esto quizás indique un problema, pero ¿es indicativo de algo mal o es un problema menor (solo estético)?
ACTUALIZACIÓN 5
En Proyecto> Propiedades ..., la plataforma está configurada en "Activa (Cualquier CPU)" y la plataforma se identifica de la misma manera ("Activa (Cualquier CPU)")
He leído que esto está mal, que debe ser "x86", pero no hay una opción "x86" disponible. ¿Alguna CPU es la única ...?
ACTUALIZACIÓN 6
En Proyecto> Propiedades ...> Dispositivos, se activa la opción " Implementar la versión más reciente de .NET Compact Framework (incluidos Service Packs) ". ¿Es esto como debería ser?
ACTUALIZACIÓN 7
De acuerdo, aquí está la parte realmente extraña de todo esto:
Tengo dos aplicaciones CF / CE que necesito ejecutar en estos dispositivos de mano Motorola / Symbol 3090 y 3190.
Una es esta simple utilidad discutida anteriormente. Encuentro que realmente se ejecuta en uno de los dispositivos (el 3190, FWIW). Por lo tanto, se ejecuta en un dispositivo, pero no en el otro.
SIN EMBARGO, el otro (legacy) .exe es el opuesto: se ejecuta en el 3090 (donde la utilidad ni siquiera se iniciará), pero no en el 3190.
De modo que el 3190 satisface las necesidades de la utilidad y el 3090 satisface las necesidades de la utilidad heredada. Sin embargo, la NUEVA versión de la aplicación heredada no se ejecuta en ninguno de los dispositivos.
Estoy desconcertado; Siento lo que Casey Stengel debe tener al hablar una vez de sus tres receptores: " Tengo uno que puede lanzar pero no puede atrapar, uno que puede atrapar pero no puede lanzar, y otro que puede golpear pero no puede hacerlo. "
ACTUALIZACIÓN 8
El 3190 tiene una versión más nueva del CF instalado; parece que tanto las aplicaciones nuevas como las antiguas deben ejecutarse en el nuevo dispositivo con el CE más nuevo, pero no es así, solo lo hace el que está basado en / para el nuevo marco ...
ACTUALIZACIÓN 9
Así es como luce el 3090:
ACTUALIZACIÓN 10
Así que tengo dos exes, uno que se ejecuta en los dispositivos (los dos ahora) y el otro que se ejecutará en ninguno de los dispositivos. Los dos exesw parecen casi idénticos. Los comparé con tres herramientas: Reflector .NET de Red Gates; JetBrains ''dotPeek y Dependency Walker.
Esto es lo que encontré:
Dependency Walker Ambos parecen tener los mismos errores acerca de las dependencias perdidas (no los tenía en la misma carpeta con sus ensamblajes dependientes, probablemente sea el problema)
Reflector de .NET El archivo que no funciona tiene esta entrada que el archivo de trabajo no:
[assembly: Debuggable(0x107)]
¿Es este el problema? De ser así, ¿cómo puedo cambiarlo?
JetBrains dotPeek Las referencias en la copia de trabajo del exe son todas versión 1.0.50000.0
El exe que no funciona tiene una lista idéntica de referencias, y el mismo número de versión.
Sin embargo, existe esta diferencia:
Para el .exe de trabajo, dotPeek dice " 1.4.0.15, msil, Pocket PC v3.5 ". Para el .exe que no funciona, dotPeek dice, " 1.4.0.15, msil, .Net Framework v4.5 "
¿Es este el problema y, de ser así, cómo puedo cambiar el .exe que no funciona para que coincida con el que está trabajando?
Esto último es desconcertante, principalmente porque no veo lugar en la versión no operativa (más reciente) del proyecto donde existe una cadena "4.5". ¿Dónde podría dotPeek obtener esa información?
ACTUALIZACIÓN 11
Ahora sé que el problema está en algún lugar entre estos dos MessageBox.Show () s, porque el primero que veo, pero no el segundo:
public static int Main(string [] args)
{
try
{
// A home-brewed exception handler (named ExceptionHandler()) is already defined, but I''m adding a global one
// for UNHANDLED exceptions (ExceptionHandler() is explicitly called throughout the code in catch blocks).
MessageBox.Show("made it into Main method"); // TODO: Remove after testing <= this one is seen
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(GlobalExceptionHandler);
string name = Assembly.GetExecutingAssembly().GetName().Name;
IntPtr mutexHandle = CreateMutex(IntPtr.Zero, true, name);
long error = GetLastError();
if (error == ERROR_ALREADY_EXISTS)
{
ReleaseMutex(mutexHandle);
IntPtr hWnd = FindWindow("#NETCF_AGL_BASE_",null);
if ((int) hWnd > 0)
{
SetForegroundWindow(hWnd);
}
return 0;
}
ReleaseMutex(mutexHandle);
DeviceInfo devIn = DeviceInfo.GetInstance();
Wifi.DisableWifi();
// Instantiate a new instance of Form1.
frmCentral f1 = new frmCentral();
f1.Height = devIn.GetScreenHeight();
f1.Text = DPRU.GetFormTitle("DPRU HHS", "", "");
MessageBox.Show("made it before Application.Run() in Main method"); // TODO: Remove after testing <= this one is NOT seen
Application.Run(f1);
devIn.Close();
Application.Exit();
return 0;
}
catch(Exception ex)
{
DPRU.ExceptionHandler(ex, "Main");
return 0;
}
} // Main() method
ACTUALIZACIÓN 12
Más específicamente, tengo bucle infinito en marcha de alguna manera; Al mezclar la píldora "Ent" en el dispositivo portátil (así es como se ve el botón, una "pastilla"), suena como jerbos (tap) bailando (como depuración de MessageBox.Show () s en dos métodos que aparecen y se descartan y sobre ad infinitum ad (literalmente) nausea).
Si una aplicación no se inicia, en su mayoría falta algo. A medida que compiló para WindowsCE y CF3.5, las ejecuciones Compact Framework 3.5 deben instalarse en el dispositivo WindowsCE. Normalmente Compact Framework es parte de las imágenes de Windows CE, al menos la versión 1.0, pero ¿quién sabe para su dispositivo de prueba? Si se instala al menos un CF, una aplicación que requiera una versión CF más nueva lo mostrará al inicio con un mensaje que indique la versión perdida. Entonces, o CF no está en su dispositivo, o algo está realmente mal.
Puede ejecutar / Windows / cgacutil.exe para verificar la versión CF instalada en el dispositivo. La herramienta mostrará la versión de CF.
Puede depurar usando una conexión TCP / IP o conexión ActiveSync. Ver remote debuggung en otro lugar en , escribí una larga respuesta sobre la depuración remota a través de TCP / IP. ¿O su dispositivo no tiene USB, WLAN o ENET?
Actualización: Aquí está la respuesta para la depuración remota a través de tcp / ip: VS2008 se conecta de forma remota al dispositivo Win Mobile 6.1 Esto también habilitará la implementación remota "En Proyecto> Propiedades ...> Dispositivos," Implementar la última versión de .NET El Marco Compacto (incluidos los Service Packs) "está marcado. ¿Es así como debería ser?"
¿Las aplicaciones anteriores que escribiste también escribieron .NET? El marco compacto no se preocupa por la arquitectura del procesador, solo los tiempos de ejecución de CF tienen que coincidir con el procesador. Por lo tanto, no necesita un objetivo x86 como si escribiera un proyecto nativo de C / C ++ SmartDevice.
A sus comentarios: a) CF1.0 está instalado en el dispositivo. b) el exe creado en la computadora de los colegas parece estar construido para CF1 y, por lo tanto, se ejecuta correctamente. c) su exe está diseñado para CF 3.5 y no se ejecuta, ya que no hay un tiempo de ejecución de CF3.5 en el dispositivo. d) la mayoría de los archivos de CF exe son muy pequeños, siempre que no incluyan grandes recursos o ...
Conclusión hasta el momento: instale el tiempo de ejecución CF3.5 en el dispositivo: http://msdn.microsoft.com/en-us/library/bb788171%28v=vs.90%29.aspx . Para ejecutar la aplicación heredada en ambos dispositivos, también deben instalarse los tiempos de ejecución de referencia Motorola o de terceros. Recomiendo encarecidamente la configuración de su entorno para que pueda usar ActiveSync / WMDC para el desarrollo, la implementación y la depuración del dispositivo. Si no puede buscar a un colega más experimentado.