|
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 797
|
||||||
Вызов неуправляемого метода крашит программу22.04.2025, 13:39. Показов 2371. Ответов 22
Метки нет (Все метки)
Здравствуйте!
Есть внешняя библиотека загружаемая через DllImport. Она работает нестабильно: при определенных входных данных приложение зависает или прекращает работу. Иногда она то зависает, то работает нормально на одних и тех же данных. Но мне все равно очень хочется использовать эту библиотеку. Я пробовал вызывать этот метод в асинхронном Task. Пробовал создавать отдельный поток с этим методом, ждать 5 секунд и потом вызывать Thread.Kill в случае зависания. Не помогает: иногда случаются зависания метода, и это убивает все приложение. Есть идея написать отдельное консольное приложение и вызывать его через сторонний Process, но это звучит как-то совсем жестко. Есть идеи как работать с проблемной зависающей внешней библиотекой без вылета всего приложения? На всякий случай мой код.
0
|
||||||
| 22.04.2025, 13:39 | |
|
Ответы с готовыми решениями:
22
Вызов метода(делегата) из неуправляемого кода Вызов неуправляемого кода из длл
|
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
|
| 22.04.2025, 13:45 | |
|
Запуск внешнего процесса через Process хорошая идея.
Вам нужно добавить настройки таймаута и эмпирически подобрать эти настройки, чтобы можно было автоматически детектить зависание. У Task-ов уже есть все необходимое API для этого.
0
|
|
|
Native x86
6853 / 3787 / 1024
Регистрация: 13.02.2013
Сообщений: 11,861
|
|
| 22.04.2025, 13:50 | |
|
DLL точно экспортирует функции с конвенцией stdcall?
0
|
|
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
|
| 22.04.2025, 13:52 | |
|
Я не работал с Interop-ом, возможно вы что-то неаккуратно сделали, кто-знает, поэтому работает нестабильно.
Нужно смотреть описание функций, которыми пользуетесь.
0
|
|
|
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 797
|
|||||||
| 22.04.2025, 13:58 [ТС] | |||||||
"Managed Debugging Assistant 'PInvokeStackImbalance' : 'Вызов функции PInvoke "TrainSimulatorLibrary!Pkbct.TrainSimula torLibrary.Models.Adapters.EnergyOptimal Adapter+GetArgsAddresCHandler::Invoke" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.'"
0
|
|||||||
|
Native x86
6853 / 3787 / 1024
Регистрация: 13.02.2013
Сообщений: 11,861
|
||
| 22.04.2025, 14:10 | ||
|
Похоже код внутри DLL знатно портит память процесса, раз даже ловушка исключений не помогает. Вы уверены, что правильно ее используете?
0
|
||
|
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 797
|
||
| 22.04.2025, 14:17 [ТС] | ||
|
Не уверен что все использую верно. Возможно я подсовываю программе некорректные входные данные (input.WriteInput(pAdd);), но программа составлена по примеру автора библиотеки и результат похож на правду.
0
|
||
|
Native x86
6853 / 3787 / 1024
Регистрация: 13.02.2013
Сообщений: 11,861
|
|
| 22.04.2025, 14:20 | |
|
Что-то по этому вашему симулятору ничего не гуглится. Есть какая-то документация, или сишные хидеры? Где вы сигнатуры функций смотрите?
1
|
|
|
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 797
|
||||||
| 22.04.2025, 14:37 [ТС] | ||||||
|
Не гуглится потому что мы в открытый доступ свои разработки и не выкладываем. Dll-ка c руководством кстати получена давно от такой же закрытой конторы.
Если очень-очень интересна документация - то вот. Кликните здесь для просмотра всего текста
Sample к документации (слегка подправленный мной). Самостоятельно сделать аналог к нему муторно, потому что надо составить входные данные. А так порядок вызова основных функций у меня такой же.
0
|
||||||
|
Native x86
6853 / 3787 / 1024
Регистрация: 13.02.2013
Сообщений: 11,861
|
|||
| 22.04.2025, 14:58 | |||
|
Странно:
При этом колбеки все:
Может проще будет на C/C++ написать? Добавлено через 1 минуту P.S. Попахивает документом с грифом "ДСП", вам не настучат за выкладывание подобного?
1
|
|||
|
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 797
|
||
| 22.04.2025, 15:13 [ТС] | ||
|
Никакого (int (__cdecl*)(int (__cdecl*)(int)) там нет (которое воспринимаются на моем нынешнем знании C++ как грязное ругательство). P.S. Ну так я же .dll-ку в сеть не выложил. От голого мануала немного толку, даже пример кода без прилагающегося .txt-шника с данными хрен запустишь.
0
|
||
|
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 797
|
|
| 22.04.2025, 15:37 [ТС] | |
|
IamRain, Изначально я пробовал все делать стандартно через [DllImport]extern. Работало, но только один раз: при повторном вызове моего метода Compute возникало исключение. Помог только такой костыль.
0
|
|
|
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 797
|
|
| 23.04.2025, 11:57 [ТС] | |
|
Скорее всего все из-за работы сборщика мусора и кривоватой реализации библиотечной API.
Я получаю указатель из API-шного вызова, затем пишу в него не хилый такой динамический блок байт (input.WriteInput(pAdd)), потом опять же вызываю API функцию работающую от записанных данных. А если в это время подсуетится ничего не знающий о размере указателя сборщик мусора, то данные херятся и программа творит дичь. Добавление GC.Collect в начале вызова метода помогло существенно уменьшить вылеты, но не идеально. Пока я не знаю как получив от API IntPtr запретить сборщику мусора изменять этот указатель на нужный мне массив байт (размер массива я могу получить).
0
|
|
|
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 962
|
||
| 23.04.2025, 15:17 | ||
|
0
|
||
|
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 797
|
|
| 23.04.2025, 16:00 [ТС] | |
|
Глюки идут при использовании в шарпе.
0
|
|
|
14090 / 9308 / 1348
Регистрация: 21.01.2016
Сообщений: 34,956
|
||
| 24.04.2025, 17:34 | ||
|
Это - раз. Два - сама неуправляемая библиотека должна быть рассчитана на работу в таком стиле. Т.е. обмен данными с вызывающей стороной (в обе стороны) тупо через копирование данных. Никакого обмена ссылками\указателями с последующим удержанием до второго прихода Христа. DLL'ка рассчитана на такое?
0
|
||
|
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 797
|
|||||||
| 25.04.2025, 09:31 [ТС] | |||||||
|
Usaga, Я думал над этим, но так и не понял как применить fixed к IntPtr полученному из неуправляемого кода и решит ли это проблему.
Попробовал решить проблему через GC.Collect и GCHandle.Alloc(pI, GCHandleType.Pinned) к каждому IntPtr
Тестирую и разбираюсь с распределением доступа к методу из разных потоков.
0
|
|||||||
|
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
|
||
| 25.04.2025, 14:26 | ||
|
А когда pin-ишь - объекты железно остаются на своих адресах.
0
|
||
|
288 / 251 / 107
Регистрация: 26.10.2012
Сообщений: 797
|
|||||||||||
| 25.04.2025, 15:10 [ТС] | |||||||||||
|
IamRain, Ну объясните как pin-ить IntPtr, я нигде примеров не видел.
И там неуправляемый код явно выделяет большую область памяти (массив неизвестного мне размера). Как объяснить сборщику мусора не перемешать не только 4(8) байт в памяти куда указывает IntPtr , но и некоторый диапазон памяти за ним?
Как запретить сборщику мусора вмешиваться в это?
0
|
|||||||||||
| 25.04.2025, 15:10 | |
|
Помогаю со студенческими работами здесь
20
Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода преобразование ref byte в byte[] или в IntPtr без использования неуправляемого кода опасности неуправляемого кода
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|