Точка входа не найдена с 32-битной DLL. Работа с 64-битной DLL

#c# #c #dll #cuda #32bit-64bit

#c# #c #dll #cuda #32bit-64bit

Вопрос:

Наша команда разработала C CUDA DLL и C # .NET 4.5 HMI, который использует нашу DLL.

Изначально планировалось, что эти программы будут доступны только для 64-битной платформы.

Недавно наш клиент попросил нас сделать наши разработки доступными и для 32-битной платформы.

Нам удается скомпилировать DLL и HMI за 32 бита.

Итак, теперь у нас есть 2 конфигурации :

  • HMI x64, который использует CUDA DLL x64
  • HMI x86, использующий CUDA DLL x86

64-битная конфигурация работает отлично.

32-битная конфигурация имеет некоторые проблемы :

  • Доступны только некоторые экспортированные функции
  • Недоступные вызовы функций вызывают исключение: точка входа не найдена < имя> в <Dllname >

Изучение нашей 32- и 64-битной DLL с помощью Dependency Walker показывает нам все экспортированные функции. (Только искаженные имена меняются между 32 и 64 битами)

Вот несколько прототипов доступных экспортируемых функций :

 extern "C" RetourInit __declspec(dllexport) __stdcall initGPU();
extern "C" Retour __declspec(dllexport) __stdcall setImageGpu(int idGPU, int nbImages, Image * listeImages);
extern "C" Retour __declspec(dllexport) __stdcall getImageGpu(int idGPU, int nbImages, Image * listeImages);
extern "C" Retour __declspec(dllexport) __stdcall duplicateImage(int idGPU, int nbImages, Image * listeImages);
  

Вот несколько прототипов недоступных экспортированных функций :

 extern "C" Retour __declspec(dllexport) __stdcall decoupe(int idCarte, Decoupe paramDecoupe);
extern "C" Retour __declspec(dllexport) __stdcall fusion(int idCarte, Fusion paramFusion);
  

Если у вас есть какие-либо предложения или вопросы, мы будем рады их услышать.

Спасибо всем.

Комментарии:

1. Я предполагаю, что типы развязки и слияния имеют некоторую зависимость, которая привязана к 64-битной реализации. Другие экспортируемые функции используют ванильные типы.

2.Спасибо за ваш комментарий. Вот структуры, используемые в прототипе развязки: struct Decoupe{ Image image; int nbBandes; Bande * bandes; }; struct Image{ unsigned char * ptr; int largeur; int hauteur; int bpp; int tailleOctets; }; struct Bande{ unsigned char * ptr; int largeur; int hauteur; int bpp; int pasX; int pasY; int posX; int posY; bool horizontale; bool reversed; }; я не вижу никакой реализации 64-битной зависимости. Если у вас есть какое-либо другое решение, я буду рад его услышать.

Ответ №1:

Проблема была связана с передачей структур Fusion amp; Decoupe не с указателем.

Мы просто меняем наши прототипы на это :

 extern "C" Retour __declspec(dllexport) __stdcall decoupe(int idCarte, Decoupe* paramDecoupe);
extern "C" Retour __declspec(dllexport) __stdcall fusion(int idCarte, Fusion* paramFusion);
  

И адаптируйте наш DLL-код. Наш C # HMI не был изменен.

Эта модификация работает в x86 и x64.

Очень странно, что эта модификация не влияет на 64-битную платформу…

Спасибо за ваши комментарии.