Почему мое приложение CE отказывается запускаться?

Я поддерживаю приложение Windows CE в течение некоторого времени (более года) и время от времени выпускаю его новые версии, копируя их на портативные устройства и запуская там новые версии.

Однако сегодня я впервые создал новое приложение для Windows CE. Это очень простая утилита.

Чтобы создать его в VS 2008, я выбрал шаблон C# «Smart Device Project», добавил несколько элементов управления и немного кода и построил его.

Вот некоторые из вариантов, которые я выбрал:

введите здесь описание изображения

Я скопировал .exe, созданный при сборке проекта, в папку Program Files портативного устройства:

введите здесь описание изображения

...но не запускается. Это в неправильном месте? Нужно ли копировать какие-то вспомогательные файлы? Есть ли какие-то другие настройки, которые мне нужно сделать, чтобы заставить его работать? Или что?

ОБНОВИТЬ

Поскольку его не так много, я вставляю ВЕСЬ код ниже на случай, если кто-то думает, что проблема может быть в моем коде:

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;
        }

    }
}

ОБНОВЛЕНИЕ 2

Основываясь на этом, я добавил глобальный обработчик исключений в приложение, чтобы Program.cs теперь:

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));
        }
    }
}

Тем не менее, запуск новой сборки ничего не показывает - она ​​просто на мгновение "вспыхивает" с такой же многословностью, как Ли Харви Освальд после дружеского визита Джека Руби.

ОБНОВЛЕНИЕ 3

Может ли проблема быть связана с это, и если да, то как это решить?

То обстоятельство, что обе мои обновленные версии существующего приложения И это совершенно новое и простое приложение отказывается запускаться, что указывает на то, что где-то в процессе кодирования, сборки или развертывания есть какая-то фундаментальная ошибка.

ОБНОВЛЕНИЕ 4

Поскольку это минимальная утилита, причина, по которой оно (и мое унаследованное, гораздо более сложное) приложение не работает, может иметь какое-то отношение к свойствам проекта, тому, как он создается, необходимый файл не копируется или... ???

ПРИМЕЧАНИЕ. Значок на рабочем столе является «универсальным» (выглядит как пустая белая форма); это, возможно, указывает на проблему, но указывает ли это на что-то неправильное или это незначительная (только эстетическая) проблема?

ОБНОВЛЕНИЕ 5

В «Проект» > «Свойства...» для платформы установлено значение «Активен (любой ЦП)», а цель платформы — та же («Активная (любой ЦП)»)

Я читал, что это неправильно, что это должно быть «x86», но нет доступной опции «x86» - любой процессор является единственным ...?!?

ОБНОВЛЕНИЕ 6

В разделе «Проект» > «Свойства...» > «Устройства» установлен флажок «Развернуть последнюю версию .NET Compact Framework (включая пакеты обновлений)». Это так и должно быть?

ОБНОВЛЕНИЕ 7

Хорошо, вот действительно странная часть всего этого:

У меня есть два приложения CF/CE, которые мне нужно запустить на этих портативных устройствах Motorola/Symbol 3090 и 3190.

Одним из них является эта простая утилита, описанная выше. Я обнаружил, что на самом деле он работает на одном из устройств (3190, FWIW). То есть на одном устройстве работает, а на другом нет.

ОДНАКО, у другого (устаревшего) .exe все наоборот - он запускается на 3090 (где утилита даже не запустится), а на 3190 - нет.

Таким образом, потребности утилиты удовлетворяются 3190, а потребности устаревшей утилиты удовлетворяются 3090. Однако НОВАЯ версия устаревшего приложения не работает на ни одном устройстве!

я сбит с толку; Я чувствую себя так же, как Кейси Стенгель, говоря об одном из трех своих кетчеров: "Я есть тот, который может бросить, но не может поймать, тот, кто может поймать, но не может бросить, и тот, кто может ударить, но не может ни того, ни другого."

ОБНОВЛЕНИЕ 8

На модели 3190 установлена ​​более новая версия CF; кажется, что и новое, и старое приложения должны работать на новом устройстве с более новым CE, но это не так - работает только то, которое создано против/для новой платформы...

ОБНОВЛЕНИЕ 9

Вот как выглядит 3090:

введите здесь описание изображения

ОБНОВЛЕНИЕ 10

Итак, у меня есть два исполняемых файла, один из которых работает на устройствах (сейчас оба), а другой не работает ни на одном из устройств. Два EXEW кажутся почти идентичными. Я сравнил их с тремя инструментами: .NET Reflector от Red Gates; dotPeek от JetBrains и Dependency Walker.

Вот что я нашел:

Dependency Walker Кажется, у обоих одинаковые ошибки об отсутствующих зависимостях (у меня их не было в одной папке с их зависимыми сборками, вероятно, проблема в этом)

.NET Reflector В нерабочем файле есть запись, которой нет в рабочем файле:

[assembly: Debuggable(0x107)]

Является ли это проблемой, и если да, то как я могу это изменить?

JetBrains dotPeek Все ссылки в рабочей копии исполняемого файла относятся к версии 1.0.50000.0.

Нерабочий exe имеет идентичный список ссылок и тот же номер версии.

Однако есть такая разница:

Для рабочего .exe dotPeek говорит: «1.4.0.15, msil, Pocket PC v3.5». Для нерабочего .exe dotPeek говорит: «1.4.0.15, msil, .Net Framework v4.5"

Является ли это проблемой, и если да, то как мне изменить нерабочий .exe, чтобы он соответствовал рабочему?

Последнее смущает, прежде всего потому, что я не вижу места в нерабочей (более новой) версии проекта, где существует строка «4.5». Откуда dotPeek может получить эту информацию?

ОБНОВЛЕНИЕ 11

Теперь я действительно знаю, что проблема находится где-то между этими двумя MessageBox.Show(), потому что первый я вижу, а второй нет:

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

ОБНОВЛЕНИЕ 12

В частности, у меня как-то происходит бесконечный цикл; Раздавливая таблетку «Ent» на портативном устройстве (именно так выглядит кнопка — «лепешка») — это звучит как чечетка песчанок (поскольку отладка MessageBox.Show() в двух методах всплывает и закрывается через и до бесконечности (буквально) тошнота).


person B. Clay Shannon    schedule 23.04.2014    source источник
comment
Оказалось, что настоящая проблема была связана с некоторым кодом, который сделал установщик, из-за чего устройство всегда пыталось автоматически запустить приложение; так что он уже работал (пытался), когда я попытался заменить .exe   -  person B. Clay Shannon    schedule 02.05.2014


Ответы (2)


Если приложение не запускается, скорее всего, чего-то не хватает. Поскольку вы скомпилировали для WindowsCE и CF3.5, среды выполнения Compact Framework 3.5 должны быть установлены на устройстве WindowsCE. Обычно Compact Framework входит в состав образов Windows CE, по крайней мере, версии 1.0, но кто знает для вашего тестового устройства? Если хотя бы один CF установлен, приложение, требующее более новой версии CF, покажет это при запуске сообщением о пропущенной версии. Так что либо на вашем устройстве нет CF, либо что-то идет не так.

Вы можете запустить \Windows\cgacutil.exe, чтобы проверить версию CF, установленную на устройстве. Инструмент покажет версию установленного CF.

Вы можете выполнять отладку, используя соединение TCP/IP или соединение ActiveSync. Смотрите удаленную отладку в другом месте в stackoverflow, я написал длинный ответ об удаленной отладке через TCP/IP. Или на вашем устройстве нет ни USB, ни WLAN, ни ENET?

Обновление: вот ответ для удаленной отладки через tcp/ip: VS2008 удаленно подключается к устройству Win Mobile 6.1 Это также позволит удаленное развертывание "В Project > Properties... > Devices" Разверните последнюю версию .NET Compact Framework ( включая пакеты обновлений)". Это так и должно быть?"

Являются ли более ранние приложения, которые вы написали, также написаны на .NET? Компактная структура не заботится об архитектуре процессора, только среда выполнения CF должна соответствовать процессору. Таким образом, вам не нужна цель x86, как если бы вы писали собственный проект SmartDevice C/C++.

К вашим комментариям: а) На устройстве установлена ​​CF1.0. b) исполняемый файл, созданный на компьютере коллеги, похоже, создан для CF1 и поэтому работает нормально. c) ваш исполняемый файл создан для CF 3.5 и не запускается, поскольку на устройстве нет среды выполнения CF3.5. г) большинство исполняемых файлов CF очень малы, если они не включают в себя большие ресурсы или ...

Вывод: установите среду выполнения CF3.5 на устройство: http://msdn.microsoft.com/en-us/library/bb788171%28v=vs.90%29.aspx. Чтобы запустить устаревшее приложение на обоих устройствах, также необходимо установить указанную среду выполнения Motorola или другую стороннюю среду. Я настоятельно рекомендую настроить вашу среду, чтобы вы могли использовать ActiveSync/WMDC для разработки, развертывания и отладки устройства. Если вы не можете найти более опытного коллегу.

person josef    schedule 25.04.2014
comment
На устройстве есть папка \Program Files\.NET Compact Framework, но она пуста или, по крайней мере, кажется (кто ее туда положил? зачем? почему она пуста?). пустой), но один единственный .exe-файл приложения (созданный на машине бывшего коллеги) прекрасно работает на устройстве, поэтому в ЭТОЙ версии .exe есть все, что ему нужно. Это не большой .exe, поэтому не похоже, чтобы он встроил все это в .exe (если это вообще возможно). Так что... до сих пор в тупике. - person B. Clay Shannon; 25.04.2014
comment
Так что либо на вашем устройстве нет CF, либо что-то идет не так. У меня должен быть CF, иначе устаревший .exe не запустится, верно? ...правильно ошибся? Вполне вероятно, что это действительно так. - person B. Clay Shannon; 25.04.2014
comment
Вы можете запустить \Windows\cgacutil.exe, чтобы проверить версию CF, установленную на устройстве. Инструмент покажет версию установленного CF. Там написано, MS .NET CF 1.0.3316.00 Я предполагаю, что это старая версия. Если моя догадка верна, нужно ли мне обновлять версию CF или занижать то, как я нацеливаю приложение при его создании? - person B. Clay Shannon; 25.04.2014
comment
Являются ли более ранние приложения, которые вы написали, также написаны на .NET? Я написал только один (который не запускается) и обновил/поддержал другой, который до недавнего времени отлично работал на нескольких устройствах, которые у нас есть. - person B. Clay Shannon; 25.04.2014
comment
1. Похоже, что exe-файл, созданный на машине коллег, создан для CF1 (Visual Studio 2003 или 2005?); 2./3. Из ваших комментариев видно, что на вашем устройстве установлена ​​CF1. 4. Вам необходимо установить CF3.5 на устройство: msdn.microsoft.com/en-us/library/bb788171%28v=vs.90%29.aspx - person josef; 26.04.2014
comment
Бывший/абсквированный разработчик, который разработал основной проект, сказал, что устройства не могут поддерживать CF 3.5 (недостаточно места или что-то в этом роде). Поэтому мне нужно понизить версию устройства, которое я обновил до 3.5, до меньшей версии. - person B. Clay Shannon; 28.04.2014
comment
VS2008 удаленно подключается к устройству Win Mobile 6.1 Являются ли устройства Motorola/Symbol 3090 и 3190 устройствами Win Mobile 6.1? - person B. Clay Shannon; 28.04.2014
comment
3090 и 3190 могут поставляться Motorola/Symbol с различными вариантами ОС. Можете ли вы визуально определить, работает ли устройство на CE или Mobile? На мобильном устройстве вверху есть панель задач и информации, а также домашний экран или экран «Сегодня». Устройство Windows CE может выглядеть так, как того хочет OEM-производитель. В основном устройства WinCE имеют панель задач внизу экрана. И вы не можете понизить версию устройства WM, которое поставляется с NetCF 3.5. - person josef; 29.04.2014
comment
3190 выглядит как обычный рабочий стол Windows. На нем есть обои с надписью Windows Embedded CE 6.0. Я вставил выше (обновление 9) кричащий снимок 3090, как показано на удаленном управлении дисплеем для Windows CE. - person B. Clay Shannon; 29.04.2014
comment
Таким образом, 3190 работает под управлением Windows Embedded CE 6. Для этого OEM-образа Windows CE6 должен быть пакет поддержки платы от Motorola. Я предполагаю, что 3190 использует процессор Arm XScale, так как он также доступен с Windows Mobile 6.1. Вам следует обратиться в службу поддержки Motorola. - person josef; 01.05.2014
comment
Я понятия не имею, что такое пакет поддержки платы или что он мне даст/как я буду его использовать. Как определить, какой процессор у устройства? Я могу посмотреть настройки и увидеть версию CE и версию CF, но я не вижу, где отображается тип процессора. Можно ли их как-то увидеть через командную строку? - person B. Clay Shannon; 01.05.2014

Можете ли вы попробовать запустить его в отладчике и проверить, где он не работает? Можете ли вы поставить точку останова прямо в начале Program.main и проверить, достигнута ли она? Вывод отладки также может дать вам несколько интересных советов.

person Valter Minute    schedule 24.04.2014
comment
Нет, я не могу отлаживать это таким образом; это не так, и я не думаю, что можно настроить для этого (поверьте мне, я пытался и перепрыгнул через много обручей, в процессе чего мои хвостовые перья сгорели дотла). Собираем на ПК, копируем exe на наладонник и запускаем. Отладка осуществляется с помощью MessageBox.Show() и т.д. - person B. Clay Shannon; 24.04.2014
comment
Вы пытались создать пустое приложение .NET CF и запустить его на цели. Просто чтобы проверить, является ли это проблемой конкретного проекта или что-то не так на целевом устройстве или на вашем компьютере разработчика. - person Valter Minute; 25.04.2014
comment
Это приложение настолько простое, насколько это возможно, поэтому я бы сказал, что что-то не так на портативном устройстве или ПК. -- или локализованный Э.М.П. ударил в мой куб. - person B. Clay Shannon; 25.04.2014
comment
Это просто, но сложнее, чем привет, мир, созданный мастером. Проверка того, работает ли привет, мир, полезна, чтобы понять, есть ли что-то не так в приложении или в среде выполнения .NET на цели, ИМХО. - person Valter Minute; 28.04.2014