¿Por qué mi aplicación CE se niega a ejecutarse?

He estado manteniendo una aplicación de Windows CE desde hace algún tiempo (más de un año) y he producido nuevas versiones de vez en cuando, copiándolas en los dispositivos portátiles 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 # "Proyecto de dispositivo inteligente", agregué algunos controles y un poco de código, y lo construí.

Estas son algunas de las opciones que seleccioné:

Copié el .exe producido al compilar el proyecto en la carpeta Archivos de programa del dispositivo portátil:

... pero no funcionará. ¿Está en la ubicación incorrecta? ¿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 a continuación en caso de que alguien piense 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

Residencia enesta, Agregué un controlador de excepción global a la aplicación para que Program.cs ahora sea:

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 construcción no muestra nada: simplemente "parpadea" momentáneamente con tanta verbosidad como Lee Harvey Oswald después de la visita amistosa de Jack Ruby.

ACTUALIZACIÓN 3

¿Podría el problema estar relacionado conestay, si es así, ¿cómo resolverlo?

La circunstancia de que tanto mi versión actualizada deuna aplicación existente Y esta aplicación nueva y simple se niega a ejecutarse indica que hay algo fundamentalmente defectuoso en algún lugar 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 (y mi legado, mucho más involucrado) la aplicación no funciona puede tener algo que ver con las propiedades del proyecto, cómo se está construyendo, un archivo necesario que no se copia, o ... ???

NOTA: El icono del escritorio es "genérico" (parece un formulario blanco en blanco); esto quizás indica un problema, pero ¿es indicativo de algo mal o es un problema menor (solo estético)?

ACTUALIZACIÓN 5

En Proyecto> Propiedades ..., la Plataforma se establece en "Activo (cualquier CPU)" y la plataforma se orienta a la misma ("Activo (cualquier CPU)")

He leído que esto está mal, que debería ser "x86", pero no hay una opción "x86" disponible. ¿Alguna CPU es la única ...?

ACTUALIZACIÓN 6

En Proyecto> Propiedades ...> Dispositivos, el "Implemente la última versión de .NET Compact Framework (incluidos los Service Packs)"está marcado. ¿Es así como debería ser?

ACTUALIZACIÓN 7

Bien, aquí está la parte realmente extraña de todo esto:

Tengo dos aplicaciones CF / CE que necesito ejecutar en estos dispositivos portátiles Motorola / Symbol 3090 y 3190.

Una es esta sencilla utilidad discutida anteriormente. Me parece que en realidadhace ejecutar 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 .exe (heredado) es lo contrario: se ejecuta en el 3090 (donde la utilidad ni siquiera se iniciará), pero no en el 3190.

Por lo tanto, 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 enya sea ¡dispositivo!

Estoy desconcertado; Me siento comoCasey 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 uno que puede golpear pero tampoco puede hacerlo."

ACTUALIZACIÓN 8

El 3190 tiene instalada una versión más nueva del CF; parece que tanto las aplicaciones nuevas como las antiguas deberían ejecutarse en el nuevo dispositivo con el CE más nuevo, pero no lo hacen, solo lo hace contra / para el nuevo marco ...

ACTUALIZACIÓN 9

Así es como se ve el 3090:

ACTUALIZACIÓN 10

Así que tengo dos exes, uno que se ejecuta en los dispositivos (ambos ahora) y el otro que no se ejecutará en ninguno de los dispositivos. Los dos exesw parecen casi idénticos. Los comparé con tres herramientas: el reflector .NET de Red Gates; DotPeek de JetBrains y Dependency Walker.

Aquí está lo que encontré:

Caminante de dependencia Ambos parecen tener los mismos errores sobre las dependencias que faltan (no los tenía en la misma carpeta con sus ensamblajes dependientes es probablemente el problema allí)

Reflector .NET El archivo que no funciona tiene esta entrada que el archivo de trabajo no:

[assembly: Debuggable(0x107)]

¿Es este el problema y, si es así, cómo puedo cambiarlo?

JetBrains dotPeek Las referencias en la copia de trabajo del exe son todas la 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, si es así, cómo puedo cambiar el .exe que no funciona para que coincida con el que funciona?

Esto último es desconcertante, principalmente porque no veo lugar en la versión que no funciona (más reciente) del proyecto donde existe una cadena "4.5". ¿Dónde podría dotPeek obtener esa información?

ACTUALIZACIÓN 11

I hacer 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 bucles infinitos 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 el baile de tap de los jerbos (como depuración de MessageBox.Show () s en dos métodos aparecen y se descartan y sobre ad infinitum ad (literalmente) náuseas).

Respuestas a la pregunta(2)

Su respuesta a la pregunta