|
1 / 1 / 0
Регистрация: 19.04.2014
Сообщений: 12
|
||||||
C# зависает при попытке получить из dll длинные данные (строку, массив)19.04.2014, 11:55. Показов 2151. Ответов 9
Метки нет (Все метки)
Имеется внешняя dll (не C#) с экспортными функциями, которая динамически стыкуется к проекту на C#.
всё замечательно работает ровно до того момента, пока длина возвращаемой строки не превышает определённое значение. При превышении поведение такое: из функции dll-ки выходит штатно (путём логирования в самой длл-ке выяснено, что функция полностью и штатно отрабатывает и корректно выходит из вызванной функции), но в проекте на шарпе сразу после строчки вызова экспортной функции выполнение останавливается, никаких сообщений об ошибках не выводится, т.е. чистый hungapp. Подозреваю, что это может быть связано с обработкой шарпом возвращаемых аргументов, но как побороть? Экспериментальным путём было выяснено, что макс. размер строки (в байтах), не вызывающий данную проблему - 158436, при длине в 158438 - уже зависание. Замена String на массив char[] не меняет поведение шарпа - всё то же самое. У кого какие идеи есть на этот счёт? Добавлено через 18 минут интересное наблюдение: дело даже если возвратить пустую строку, но выделить для неё кусок памяти в 158438 и более - тоже эффект зависания Добавлено через 2 часа 0 минут дополнительные результаты при сравнении версий .NET: 4.0 - как написано в сабже - hungapp 3.5 & 2.0 - выскакивает ошибка .NET: Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. 1.1 - выскакивает ошибка .NET: Необработанное исключение: System.NullReferenceException: В экземпляре объекта не задана ссылка на объект. при этом строки размером 158436 и менее также корректно обрабатываются этими версиями .NET
0
|
||||||
| 19.04.2014, 11:55 | |
|
Ответы с готовыми решениями:
9
Ошибка при попытке получить данные с API Циклическая ссылка при попытке получить данные из контроллера
|
|
1 / 1 / 0
Регистрация: 19.04.2014
Сообщений: 12
|
|
| 19.04.2014, 17:27 [ТС] | |
|
dll на лазарус
function GetInfo(Const FileName: PWideChar; Const FileOpeningMode: longword; var Info: PWideChar): longint; cdecl; память выделяется длл-кой. суть в том, что данная функция из этой же длл-ки работает корректно (в т.ч. при больших объёмах строки) при подключении её к проектам на классических языках, например, лазарус, си++. проблема возникла только с шарпом
0
|
|
|
1 / 1 / 0
Регистрация: 19.04.2014
Сообщений: 12
|
|
| 19.04.2014, 21:36 [ТС] | |
|
NickoTin, спасибо огромное! помогло. теперь нормально обрабатываются даже строки размеров более 200 Кб.
получается, я нарвался на глюк шарпа при обработке строковых параметров? (не судите строго - я в шарпе только вчера первый раз код набил, обычно по роду деятельности приходится работать с другими языками, а тут возникла необходимость связать длл-ку с шарпом)
0
|
|
|
Master of Orion
|
|
| 19.04.2014, 21:51 | |
|
0
|
|
|
Почетный модератор
|
||
| 19.04.2014, 22:13 | ||
|
Чтобы сигнатура была out string Info должен использоваться аллокатор CoTaskMemAlloc. Добавлено через 50 секунд Не по теме: опоздал...
0
|
||
|
1 / 1 / 0
Регистрация: 19.04.2014
Сообщений: 12
|
||
| 19.04.2014, 22:20 [ТС] | ||
|
Psilon, прочитал, но всё равно так и не понял - задумано ли так разрабами шарпа, или это глюк.
ведь, насколько мне подсказывает гугль, обработка строковых параметров осуществляется тем же самым модулем маршалинга, который при отдельном вызове корректно обрабатывает как короткие, так и очень длинные строки, но почему-то зависает или генерит экспешн при неявной обработке больших строк в параметрах Добавлено через 4 минуты 1. почему он пытается освободить память до того, как это надо по логике программы (ведь крах происходит сразу после вызова функции, хотя далее данная строка используется - выводится в консоль) 2. почему крах происходит при попытке освободить лишь блок памяти более определённой длины?
0
|
||
|
Почетный модератор
|
||||||||
| 19.04.2014, 22:45 | ||||||||
|
В общем это называется непредвиденное поведении, никто ничего не может гарантировать в данном случае, потому и рекомендуется использовать IntPtr и самостоятельно пробовать преобразовать в string используя Marshal.PtrTo*.
С использованием CoTaskMemAlloc без проблем получилось выделить 10485760 байт (10mb) и передать их через стандартный маршаллер (out string). Добавлено через 5 минут Вот вариант Marshal.PtrToStringUni в .NET 2.0
0
|
||||||||
|
1 / 1 / 0
Регистрация: 19.04.2014
Сообщений: 12
|
||
| 19.04.2014, 22:50 [ТС] | ||
|
так что, естественно, используется родной менеджер памяти среды разработки. так что решил остановиться на варианте маршалинга в "ручном" режиме. спасибо за разъяснения
0
|
||
| 19.04.2014, 22:50 | |
|
Помогаю со студенческими работами здесь
10
При попытке перевести строку в байтовый массив получаются одинаковые значения в массиве Выдает ошибку run time error 9 при попытке добавить данные в массив
При подключении к ноуту внешнего жесткого диска он отображается, но при попытке открыть ноут зависает Зависает Server при попытке восстановления БД Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|