Прервать вызов неуправляемой DLL

, давая элементу формы имя submit, будет просто теневое свойство submit. убедитесь, что у вас нет элемента формы с именем submit, и вы должны иметь доступ к функции отправки просто отлично.

13
задан hultqvist 7 May 2010 в 00:29
поделиться

2 ответа

Неуправляемый код можно прервать, только если он находится в "состоянии ожидания с предупреждением". Этого не произойдет, если он сжигает 100% циклов процессора. P/Invoking TerminateThread будет работать, при условии, что вы сможете получить хэндл потока, что в .NET очень сложно. Это все равно не поможет, вы потеряете стек потоков. При одном мегабайте вы быстро исчерпаете виртуальную память. Даже если такая необходимость возникает лишь время от времени, вы все равно можете столкнуться с серьезными проблемами, поскольку поток изменил глобальное состояние программы, а вы не знаете, как его восстановить.

Единственный хороший способ прервать неуправляемый код - запустить его в отдельном процессе и выстрелить ему в голову с помощью Process.Kill(). Операционная система уберет осколки. Вам нужно будет написать небольшую хостинговую программу для DLL и использовать одно из средств взаимодействия с процессами для общения с ней. Сокеты, именованные трубы, .NET remoting, WCF - выбирайте сами.

27
ответ дан 1 December 2019 в 20:11
поделиться

Из MSDN

Если Abort вызывается на управляемом потоке во время выполнения неуправляемого кода, исключение ThreadAbortException не будет выброшено пока поток не вернется к управляемому код.

Таким образом, похоже, что прервать управляемый поток невозможно.
В качестве альтернативы вы можете попробовать запустить неуправляемый поток с помощью Win32 API CreateThread(), WaitForSingleObject() и TerminateThread(). Используйте сигнатуры из здесь.

Сам я не пробовал, но это, несомненно, влечет за собой некоторые риски, поскольку вы не можете определить, в какой момент выполнения вы убиваете поток. Это также может привести к утечке ресурсов. В MSDN перечислены некоторые побочные эффекты в ссылке TerminateThread().

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

4
ответ дан 1 December 2019 в 20:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: