Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для Ereona
374 / 135 / 19
Регистрация: 16.07.2010
Сообщений: 342

Импорт методов из dll на C

03.02.2014, 08:57. Показов 1408. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, как импортировать в dll на C# такие вот методы из dll на C:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void write_int(int value, unsigned char **d, unsigned int *ds)
{
    unsigned int size = *ds + sizeof(int);
    *d = (unsigned char *)realloc(*d, size);
    memcpy(*d + *ds, &value, sizeof(int));
    *ds += sizeof(int);
}
 
int read_int(unsigned char **d, unsigned int * offset)
{
    int value;
    memcpy(&value, *d + *offset, sizeof(int));
    *offset += sizeof(int);
    return value;
}
Какие должны быть параметры у экспортированных методов? Нужны ли какие-нибудь дополнительные действия (типа копирования или освобождения памяти)?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2014, 08:57
Ответы с готовыми решениями:

Импорт DLL
Есть DLL, в которой определён namespace DLL_test, а в программе нужно импортировать функции из этой DLL. Вся проблема в том, что namespace...

Импорт из dll
В dll есть функция, возвращающая строку в стиле С char const* __cdecl fn() импортирую её public static extern IntPtr...

Импорт dll на си в C#
Здравствуйте! Всех с Рождеством! Пытаюсь выполнить пример из книги Шилдта(ключевое слово extern): Создаю файл ExtMeth.c: #include...

5
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
04.02.2014, 01:30
Лучший ответ Сообщение было отмечено NickoTin как решение

Решение

C#
void write_int(int value, /* void | int */ byte **d, int *ds);
void write_int(int value, ref IntPtr d, ref int ds);
 
int read_int(/* void | int */ byte **d, int * offset);
int read_int(ref IntPtr d, ref int offset);
int read_int(ref /* int[] */ byte[] d, ref int offset);
d - должен быть указатель на массив выделенный при помощи malloc или realloc. В случае read_int в общем случае использование [re]malloc не обязательно, но т.к. код по идее используется в связке, то третий вариант малоприменим.

з.ы. Надеюсь, этот код лишь для изучения?
1
 Аватар для Ereona
374 / 135 / 19
Регистрация: 16.07.2010
Сообщений: 342
04.02.2014, 12:00  [ТС]
Спасибо.
Нет, к сожалению, не только для изучения.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
04.02.2014, 12:54
Цитата Сообщение от Ereona Посмотреть сообщение
Нет, к сожалению, не только для изучения.
Тогда вопрос: зачем использовать memcpy, когда можно использовать разыменование указателя для записи/чтения значения? Например:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void write_int(int value, unsigned char **d, unsigned int *ds)
{
    unsigned int size = *ds + sizeof(int);
    *d = (unsigned char *)realloc(*d, size);
    *(int*)(*d + *ds) = value;
    *ds += sizeof(int);
}
 
int read_int(unsigned char **d, unsigned int * offset)
{
    int value = *(int*)(*d + *offset)
    *offset += sizeof(int);
    return value;
}
0
 Аватар для Ereona
374 / 135 / 19
Регистрация: 16.07.2010
Сообщений: 342
04.02.2014, 13:04  [ТС]
Вопрос не ко мне =) Этот код писал человек, который C не очень хорошо знает (как и я, впрочем). Есть ли разница в производительности этих двух способов? Или вы просто не хотите "стрелять из пушки по воробьям"?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
04.02.2014, 13:30
В производительности разница будет, накладные ресурсы на вызов метода и также зависит от того как метод будет использоваться, может его доля в общем процессе выполнения будет столь незначительна что оно не стоит того внимания и есть другие узкие места. Это, пожалуй, действительно как стрелять из пушки по воробьям, избыточно.

Ну и я бы поменял realloc на какой-нибудь другой системный аллокатор: LocalReAlloc (аналогичен Marshal.ReAllocHGlobal) или HeapReAlloc. Хотя каждый раз делать реаллок тоже не гуд...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2014, 13:30
Помогаю со студенческими работами здесь

Отлавливание методов, вызываемых dll
Подключена у меня к проекту dll-ка. Условно-бесплатная. И через определенное время выбивает сообщение о необходимости купить ее, или что-то...

Импорт dll в exe
Кто знает, как импортировать dllку в проект, чтобы не нужно было ее в папке с .exe потом держать и прога нормально запускалась на другом...

Импорт функции из dll
Доброго времени суток. Есть dll на с++ с некоторой функцией такого вида: extern "C" __declspec(dllexport) void...

Импорт функций из DLL
Доброго времени суток. Необходимо импортировать библиотеку, написанную на с. Прочитал msdn и google. Например, в код С++ long...

Импорт c++ dll в проект на c#
Форумчане, доброго времени суток. Есть проблема, пересмотрел на нашем форуме, все что находил не помогает. Суть вопроса. Есть проект...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
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
прикрепляю статью
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru