Неуправляемый код прерывается только в том случае, если это «состояние ожидания с оповещением». Не будет, когда он сжигает 100% циклов процессора. P / Invoking TerminateThread будет работать, если вы сможете получить дескриптор потока, что очень затрудняет .NET. В любом случае это не поможет, вы потеряете стек потоков. На один мегабайт вы быстро исчерпаете виртуальную память. Даже если это только случайная необходимость, вы все равно можете столкнуться с серьезными проблемами, так как поток изменил глобальное состояние программы, и вы не знаете, как его восстановить.
Единственный хороший способ прервать неуправляемый код - запустить его в отдельном процессе и выстрелить в голову с помощью Process.Kill (). Операционная система очистит шрапнель. Вам нужно написать небольшую хостинговую программу для DLL и использовать одно из средств взаимодействия процессов, чтобы поговорить с ней. Розетки, именованные каналы, удаленное взаимодействие .NET, WCF, выбирайте сами.