#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-битную платформу…
Спасибо за ваши комментарии.