Почему строка кода в блоке try / catch по-прежнему вызывает сбой всего приложения? - PullRequest
0 голосов
/ 27 ноября 2010

Я боролся с этим уже несколько часов, и, может быть, я просто не так хорошо понимаю справочные сборки.

У меня есть приложение .NET CF 1.0, работающее в Windows CE 4.2 / 5.0.

Существует управляемая сборка, которая является частью SDK для устройства, которое я добавила в качестве ссылки на мой проект.

В большинстве случаев все прекрасно работает. Я могу вызвать методы и успешно изменить состояние устройства (например, установить состояние клавиатуры или уменьшить яркость подсветки).

На некоторых устройствах, когда мое приложение обращается к коду, который ссылается на DLL, оно просто взрывается само по себе

Моя проблема в том, что я не могу оправиться от этого. Код полностью содержится в try / catch, перехватывающем общее исключение:

try
{                   
    if (Terminal.API.UnitAPI.KbdGetKeyInputState() == 
                         (int)Terminal.API.KbdState.AlphaOn)
     Terminal.API.UnitAPI.KbdSetKeyInputState
                          (Terminal.API.KbdState.AlphaDown);
}
catch (Exception e) 
{
    log("Error loading DLL: " + e.Message);
} 

Если у кого-нибудь есть идеи о том, как правильно восстановиться после этого, я был бы признателен. Спасибо.

Ответы [ 4 ]

2 голосов
/ 27 ноября 2010

Если ваша сборка A ссылается на другую сборку B, то B фактически не загружается, пока первый метод не будет JITed, который ссылается на что-то в сборке B. Если сборка B недоступна, произойдет сбой во время выполнения во время JIT-компиляции Ваш метод не при выполнении вызова . Это исключение не может быть надежно поймано , поскольку на самом деле не является исключением .

Если эта ссылочная сборка может быть недоступна на некоторых платформах, вместо этого следует загрузить ее с помощью отражения. Этот механизм генерирует исключение, которое вы можете поймать.

2 голосов
/ 27 ноября 2010

исключения, возникающие в собственных API, не могут быть обработаны. это естественное поведение, поскольку блок try catch интерпретирует только управляемые исключения.

0 голосов
/ 27 ноября 2010

Ошибки в объявлении неуправляемых функций, в использовании неуправляемых функций или в ошибках / взломах / обходных путях внутри неуправляемого кода могут привести к повреждению памяти процесса, приводят к AccessViolationException, ExecutionEngineException и сбоям, в зависимости от сломанного расположения в памяти, это может переключаться между различными машинами и состояниями приложения.

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

Прежде всего, проверьте объявление неуправляемой функции, особенно поля int / uint / IntPtr. Во-вторых, проверьте, что вы отправляете ожидаемые значения и не освобожденные указатели (IntPtr) с выделенным для них достаточным объемом памяти.

0 голосов
/ 27 ноября 2010

Возможно, вы захотите взглянуть на этот вопрос , который я поднял некоторое время назад. Корень моей проблемы был в том, что выброшенное исключение НЕ наследовало от System.Exception, поэтому оно не было поймано.

...