![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| marcusmae |
|
||||||||||||||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Хочу научиться делать wrapper'ы для функций из unmanaged dll на С.
Имею там функцию :
Для вызова из managed использую DllImport :
Используемые типы gsl_matrix, gsl_vector, gsl_multifit_linear_workspace нужно писать заново, потому что из dll их не извлечь (поправьте, если неправ), поэтому создал всё "близко к тесту", добавив конструкторы : 1) структуру
переписал так :
2) структуру
переписал так :
3) структуру
переписал так :
Так вот, при попытке обращения к gsl_multifit_linear из управляемого кода, портятся параметры, передаваемые по ссылке. Например, X.size1 = 2, X.size2 = 2 приходит в unmanaged gsl_multifit_linear в виде X->size1 = 17235980, X->size2 = 10893332. Подскажите, пожалуйста, как получить верные параметры. -------------------- ἀπὸ μηχανῆς θεός |
||||||||||||||||
|
|||||||||||||||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
Если пердаете парметр по ссылке, то и получать надо ссылку.
Затем методом Marshal.GetObjectForIUnknown или сходными получаешь обьект и приводьшь к твоему типу. Добавлено @ 16:06 Или я что-то не так понял? |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Перемудрил. Оказывается, нужно было типы переписывать как struct, а не как class. Кроме того, важен аттрибут [StructLayout(LayoutKind.Sequential)] - при отсутствии возникает memory corrupt.
Тоже, подумал, что ещё понадобятся [MarshalAs(UnmanagedType.*)], но вроде пока не понадобились. Теперь структуры нормально передаются (без всяких IntPtr), ерунда пока получается только в параметре
Это сообщение отредактировал(а) marcusmae - 21.8.2006, 16:14 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
marcusmae,
походу дела size_t это unsigned int (т.е. 32-битный), а вот ulong в .NET имеет размер 64 бита, так что на самом деле надо было использовать uint. Это сообщение отредактировал(а) Дрон - 21.8.2006, 17:23 -------------------- Да. Именно так. |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
да, спасибо, это я тоже уже исправил.
Проблема в данный момент заключается в An unhandled exception of type 'System.AccessViolationException' видимо, при попытке неуправляемого кода писать по переданным функции ссылкам. Это сообщение отредактировал(а) marcusmae - 21.8.2006, 17:43 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Может, для простых типов пойдёт не "ref double" а "double *" ? -------------------- ![]() |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |