System.MissingMethodException - только при запуске устройства - PullRequest
0 голосов
/ 01 марта 2019

Наше приложение 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-й экземпляр, приложение прерывается.

Оставит этот вопрос активным для всех, кто следует ...

1 Ответ

0 голосов
/ 02 марта 2019

Когда устройство запускается, не все API готовы к использованию с самого начала, поскольку они загружаются асинхронно.Для этого WinCE предлагает функцию isApiReady: https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms885686%28v%3dmsdn.10%29

При запуске устройства оно загружает драйверы, службы и, наконец, оболочку в соответствии с порядком раздела реестра init.Ваш код, вероятно, использует API, который еще не загружен и поэтому не работает.

Пример использования isApiReady можно найти по адресу https://github.com/hjgode/RAC_switch/blob/master/RAC_switch/WinAPIReady.cs

...