Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 11

Импорт библиотеки из С++ на С#

01.12.2019, 11:24. Показов 2429. Ответов 18

Студворк — интернет-сервис помощи студентам
Добрый день, коллеги. Требуется небольшая помощь.
Имеется библиотека написанная на С++, требуется использовать ее в проекте на С#.

Для экспорта я использую атрибут DllImportAttribute.

Так выглядит вызов функции на С++:
C++
1
uint32_t __stdcall TestFunc( uint32_t flags, const PBYTE Buffer, const char* string1, const char* string2);
Вот так я пытаюсь её вызвать:
C#
1
2
3
4
[DllImport("Test.dll", EntryPoint = "?TestFunc@@YGIABU", 
                                SetLastError = true, CallingConvention = CallingConvention.StdCall, 
                                ExactSpelling = true, CharSet = CharSet.Unicode)]
static extern unsafe UInt32 TestFunc( UInt32 flags, void* Buffer, string string1, string string2);
Следует обратить внимание, что пришлось использовать параметр EntryPoint и название функции выглядит слегка паршивым.
Для её поиска пришлось воспользоваться DUMPBIN.EXE.

Ну и сама суть. Вызов команды я делаю следующим образом:

C#
1
2
3
4
5
6
7
8
byte[] data_port = new byte[] {10};
 
fixed (byte* pBuf = data_port)
{
     result = TestFunc(0, Buffer, string1, string2);
}
 
int error = Marshal.GetLastWin32Error();
Возвращаемое значение ошибки равно 2. И вот на этом у меня получается проблема.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.12.2019, 11:24
Ответы с готовыми решениями:

Импорт библиотеки
Всем привет! Приложил снимок консоли. Подскажите пожалуйста в чем может быть проблема? Установку сделал все как тут...

Импорт DLL библиотеки
как подключить к проекту DLL библиотеку и использивать функции в ней?

Импорт библиотеки в MVS
Здравствуйте! Нужна небольшая помощь знающих! Скачал библиотеку cURL (работа с сетью и вебом), применив которую в своем коде получаю...

18
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
01.12.2019, 13:03
Цитата Сообщение от shad_lew Посмотреть сообщение
озвращаемое значение ошибки равно 2
Речь о переменной error? А TestFunc испоьзует какие-либо WinAPI методы? Если нет, то этот код бесполезен. Что в переменной result находится?
0
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 11
01.12.2019, 15:07  [ТС]
К ,сожалению, почему-то не могу отредактировать первое сообщение, ну да ладно.
Функция использует WinAPI методы.
По итогу, если все хорошо, то она генерирует некий документ и возвращаемое значение будет 0. Иначе код ошибки.
Если считать код ошибки в переменной result, он будет равен переменной error. Автор об этом сам говорит.
Если глянуть таблицу ошибок Win32Error, то получаем "ERROR_FILE_NOT_FOUND", что говорит, что не найден некий файл. Какой и почему я понять не могу.
Dll файл находится. Функция внутри него тоже.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
01.12.2019, 15:44
Цитата Сообщение от shad_lew Посмотреть сообщение
Какой и почему я понять не могу.
Это надо смотреть код вашей DLL что за файл она там ищет.

У вас кстати строки передаются как Unicode, а DLL судя по сигнатуре использует ASCII... Может в этом проблема?
0
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 11
01.12.2019, 16:02  [ТС]
Пробовал по разному и ASCII, в том числе. Ошибка все равно такая же.
Я вот думаю, а может сама функция из библиотеки неправильно экспортирована?
Исходный код DLL увы посмотреть не могу.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
01.12.2019, 21:16
shad_lew, есть пример правильного вызова этой функции на C++? Чтобы было с чем сравнивать.

Цитата Сообщение от shad_lew Посмотреть сообщение
"ERROR_FILE_NOT_FOUND", что говорит, что не найден некий файл. Какой и почему я понять не могу.
Попробуй с помощью Process Monitor установить какой файл не находится.
0
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 11
02.12.2019, 06:53  [ТС]
OwenGlendower, есть. Находится внутри другой программы.

Попробовал использовать софтину, которую вы предложили. Там порядка сотни процессов вышло.
Есть и те, у которых статус "NAME_NOT_FOUND". Таких достаточно. В общем привело в очередной тупик.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
02.12.2019, 07:37
Цитата Сообщение от shad_lew Посмотреть сообщение
есть
Ок. Значит цель повторить такой же вызов в C# и добиться чтобы он работал. Аргументы здесь как-то связаны с файлами? Может через string1, string2 что-то такое необходимо передать?

Цитата Сообщение от shad_lew Посмотреть сообщение
Попробовал использовать софтину, которую вы предложили. Там порядка сотни процессов вышло.
Нужно смотреть на сообщения только своего процесса. Можно заранее поставить фильтр по имени процесса чтобы ничего лишнего не видеть.
0
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 11
02.12.2019, 09:26  [ТС]
В аргументы string1, string2 передается просто строка с текстом. К файлам никакого дела не имеет.

Я поставил фильтр именно на экзешный файл, который и использует данную либу.
Вот там и было сотни логов. Хочу сказать, что логи с процедурой "load image" все завершены с статусом успешно.

На плюсах то все работает.
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
02.12.2019, 10:39
shad_lew, 1)const PBYTE если мне не изменяет память то это обычный IntPtr в C# зачем городить unsafe если можно сделать сразу нормально
2) По куску кода не видно что из себя у Вас представляет буфер, возможно вы просто не тот указываете?
3) ну и если файл не находит то не имея Вашей библиотеки, более чем как сказали выше Вам не помочь, анализируйте "выхлоп" монитора и ищите что не нашло.
0
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 11
02.12.2019, 11:51  [ТС]
SeIZVeIZ, на самом деле я кое-что не стал говорить, у функции есть еще 2 параметра.
В оригинале она выглядит так:
C++
1
2
3
4
5
uint32_t __stdcall TestFunc(const StartInfo& ri, const StopInfo& pi, uint32_t flags, const PBYTE Buffer, 
                                                   const char* string1 const char* string2);
typedef struct   {
// Внутри набор переменных
} StartInfo;
Вторая структура аналогична.
Я просто не думал, что параметры функции вообще важны при такой ошибке. Есть отдельно коды ошибки, которые говорят о неправильных данных в аргументах.

Собственно я вызываю так:
C#
1
2
3
4
5
6
static extern unsafe UInt32 TestFunc (Start_Info* start_info, Stop_Info* stop_info, UInt32 flags, void* Buffer, 
                                                                        string string1, string string2;
struct Start_Info
{
// Переменные внутри
};
Сам вызов делается в небезопасном коде:
C#
1
2
3
4
5
6
7
8
9
10
11
Start_Info start;
Stop_Info stop;
 
byte[] data_port = new byte[] {10};
 
fixed (byte* Buffer = data_port)
{
      result = TestFunc(&start, &stop, 0, Buffer, string1, string2);
}
 
int error = Marshal.GetLastWin32Error();
Вообще мне надо туда массив запихать. Но я не совсем понял как.
Пример небезопасного кода посмотрел в других примерах. Там тоже либу из С++ на C# используют.
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
02.12.2019, 12:27
Лучший ответ Сообщение было отмечено shad_lew как решение

Решение

shad_lew, Гуглите маршалинг, ваши структуры так же можно безопасно упаковать и передавать Intptr и не использовать не безопасный код. Для упаковки и распаковки структур есть два метода PtrToStructure и StructureToPtr буфер так же можно перевести в Intptr а для строк необходимо указать какие это строки, для этого используйте атрибуты преобразования MarshalAs.

Добавлено через 5 минут
shad_lew, вот никотин для этого специально старался Класс Marshal, использование PInvoke, небезопасный код (unsafe)
0
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 11
02.12.2019, 12:47  [ТС]
Andreyip, согласен с вами полностью. Сам хочу избавиться от небезопасного кода.
Буду переделывать тогда. Статью никотина уже изучил подробно, уж было ему в личку хотел написать (но ее нет).
Спасибо за направление.
Но все равно хочу пока разобраться почему же код ошибки такой.
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
02.12.2019, 12:58
shad_lew, Вам бы по хорошему подэбажить Вашу С++ библиотеку чтобы понять что конкретно не нравится ей, пока с нашей стороны это просто "пальцем в небо"
0
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 11
02.12.2019, 13:05  [ТС]
SeIZVeIZ, я бы с радостью, но увы способов не знаю.
Может вы подскажите какой-то?
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
02.12.2019, 13:08
Лучше всего дебажить библиотеку сделать свою реализацию и сравнить данные с отладкой на C++. Тем более говорите что код у вас есть. Я так понимаю код коммерческий поэтому вы не спешите его выкладывать.
0
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 11
02.12.2019, 16:05  [ТС]
Andreyip, да он является коммерческим, поэтому код в открытый доступ пустить не могу.
Что ж, будет переписывать вызов функции и пытаться отследить, что делает эта либа.
0
3 / 2 / 1
Регистрация: 09.12.2019
Сообщений: 17
09.12.2019, 09:19
Andreyip, приветик, тут в личные сообщения писать нельзя, ты вроде как знаешь с# не мог бы дать один микро совет?) Просто я скрипт пишу, и одну строчку реализовать не могу. Я могла бы там не знаю дать свой вк?) Или тут это запрещено?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
09.12.2019, 10:17
FeSTI, если вопрос связан с данной темой, то задайте его прямо здесь. Если нет, то создайте новую тему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2019, 10:17
Помогаю со студенческими работами здесь

Импорт С++ библиотеки в .NET проект
админа ...переместите, пожалуйста, если не в тот раздел засунул Вопрос у меня в заголовке, но есть ещё и детали. Есть основной...

Импорт функции из библиотеки на Delphi
Добрый день есть библиотека написанная на делфи в ней функция function CallXMLRPC2(AddressName: PChar; имя сервера ...

Импорт библиотеки с Гитхаба в Студию через compile
В проект необходимо добавить библиотеку. Она есть на Гитхабе: https://github.com/Androguide/HoloGraphLibrary Что нужно прописать в...

Неуправляемая DLL библиотека. Импорт, создание класса библиотеки
По курсовой нужно воспользоваться неуправляемой dll. Сразу скажу, возможно много где ошибаюсь в связи с узкими знаниями в этом...

Импорт данных из Access в Excel с использованием объекта Recordset библиотеки ADODB
'Option Explicit Sub AccessToXL() Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim myconn As String Dim TARGET_DB As...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru