Поймать сбой DLL - PullRequest
       1

Поймать сбой DLL

2 голосов
/ 27 августа 2010

У меня есть приложение, которое использует DLL для выполнения вызовов API. Есть ли способ предотвратить сбой моего приложения при сбое DLL? Я пытался поставить попытку / ловить вокруг каждого вызова, но это не работает.

Ответы [ 4 ]

3 голосов
/ 27 августа 2010

Если DLL является сторонней библиотекой, которую вы не можете изменить, вы можете загрузить и выполнить код в отдельном домене приложений .

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

Поскольку вы не можете перехватывать исключения в блоге try / catch, я предполагаю, что исключение происходит в другом потоке. Либо оберните метод (ы) в другом потоке в блоке try / catch, либо используйте событие AppDomain.UnhandledException , чтобы перехватить его.

1 голос
/ 27 августа 2010

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

1 голос
/ 27 августа 2010

Существуют определенные условия, которые всегда приводят к завершению процесса, например, StackOverflow в управляемом коде , касание защитной страницы и невозможность фиксации зарезервированной страницы стека в любом процессе (нет места для EXCEPTION_RECORD) и некоторые другие. Если вы хотите защитить свой процесс от сбоя, вызванного DLL, вам придется вызывать DLL из другого прокси-процесса. Запустите фиктивный процесс, который служит только хостом для вызовов DLL, а затем обмениваться данными с этим процессом с помощью средств IPC (разделяемая память, сетевые каналы и т. Д.). Если процесс завершится сбоем, у вас будет возможность обнаружить его и действовать соответствующим образом. Это намного сложнее, чем try/catch, но вполне выполнимо в C #. Поймите, что вам понадобится отдельное приложение в качестве пустышки для процесса краш-теста.

1 голос
/ 27 августа 2010

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

Запуск его в отдельном процессе - единственный разумный обходной путь. Хотя пытаться оправиться от этого процесса внезапно умирать неоправданно трудно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...