Наше приложение C # 2.0 CF (CompactFramework) предназначено для более старых устройств, работающих под управлением Windows CE 5.0 и 6.0.В рамках проекта создается ряд библиотек DLL для обеспечения таких функций, как связь RS-232.
На устройстве Windows CE 5.0 выбрасывается MissingMethodException
, ссылаясь на одну из этих библиотек DLL.Это происходит в начале процесса запуска приложения и только сразу после цикла питания.Если мы убиваем приложение и перезапускаем, исключение не выдается, и приложение работает отлично.Тот же результат при развертывании с использованием Visual Studio для отладки (без исключения).
На устройствах Windows CE 6.0 не возникает никаких исключений.
Поскольку это происходит только сразу после цикла питания, и мы не можемотладить проект, что я могу попытаться отследить, где и в чем причина проблемы?
Обновление
Ответ от josef
полезен.Используйте IsAPIReady
в CE 5.0 с одной из этих подсистем:
const uint SH_GDI_CE5 = 16; // Most useful
const uint SH_WMGR_CE5 = 17; // Most useful
const uint SH_SHELL_CE5 = 21; // Most useful
const uint SH_WNET_CE5 = 18;
const uint SH_COMM_CE5 = 19;
const uint SH_FILESYS_APIS_CE5 = 20;
const uint SH_DEVMGR_APIS_CE5 = 22;
const uint SH_TAPI_CE5 = 23;
const uint SH_PATCHER_CE5 = 24;
const uint SH_SERVICES_CE5 = 26;
Или используйте WaitForAPIReady
в CE 6.0 с одной из этих подсистем:
const uint SH_GDI_CE6 = 80; // Most useful
const uint SH_WMGR_CE6 = 81; // Most useful
const uint SH_SHELL_CE6 = 85; // Most useful
const uint SH_WNET_CE6 = 82;
const uint SH_COMM_CE6 = 83;
const uint SH_FILESYS_APIS_CE6 = 84;
const uint SH_DEVMGR_APIS_CE6 = 86;
const uint SH_TAPI_CE6 = 87;
const uint SH_DDRAW_CE6 = 91;
const uint SH_D3DM_CE6 = 92;
Носмущающе, но фактической проблемой оказалась не проблема низкого уровня OS / CLR, а то, что приложение было случайно запущено дважды при включении питания.Первый раз использовал ключ реестра HKLM\init
, но некоторые (неизвестные) пользователи добавили ярлык в папку Startup
.Эти два случая запускались так быстро, один за другим, что я сначала не заметил.Это был второй экземпляр, который потерпел крах.
Решением было проверить при запуске несколько экземпляров приложения, используя CreateToolhelp32Snapshot
.Если обнаружен 2-й экземпляр, приложение прерывается.
Оставит этот вопрос активным для всех, кто следует ...