Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Windows Dll в C#  (Прочитано 15318 раз)
0 Пользователей и 1 Гость смотрят эту тему.
xelos
Гость
« : 06-01-2006 10:50 » 

давно не писал на С#, тут вот вопросик возник...

есть .dll, написанная на WinAPI - разработчики сторонние дали... мне ее надо интегрировать в C# приложение. прототипы функций в .Dll следующие:
Код:
int Read_Angel2_EEPROM (int nSerialPortNo, int adresse, int & valeur);
int Write_Angel2_EEPROM (int nSerialPortNo, int adresse, int valeur);
int Read_Angel2_Info (int nSerialPortNo,LPSTR * serial,
int & version_soft,
LPSTR * nom_materiel,
int & version_materiel);

включить .dll в C# надо, самой .Dll нет еще чтобы потестить - будет в понедельник, и прогу мне сдавать в понедельник... так что пока чисто теоретически написал такую фигню для пользования .Dll:

Код:
[DllImport("ReadEEPROM.dll")]
static extern int Read_Angel2_EEPROM (UInt16 nSerialPortNo, UInt16 adresse, out UInt16 valeur);

[DllImport("ReadEEPROM.dll")]
static extern int Write_Angel2_EEPROM (UInt16 nSerialPortNo, UInt16 adresse, UInt16 valeur);

[DllImport("ReadEEPROM.dll")]
static extern int Read_Angel2_Info (UInt16 nSerialPortNo, IntPtr serial, out UInt16 version_soft, IntPtr nom_materiel, out UInt16 version_materiel);


Собссно, кто что думает по этому поводу - будет такая фигня работать или нет, особенно последняя функция...
Записан
xelos
Гость
« Ответ #1 : 06-01-2006 15:58 » 

вот блин черти, прислали .dll, похоже, что она скомпилирована без параметра exetern "C"... dumpbin /exports выдает скорреткированные имена... В общем при вызове любой функции C# не может найти точку входа в функцию....

как объявить функции в C# - идеи есть? или только перекомпиляция dll поможет?
Записан
Alf
Гость
« Ответ #2 : 06-01-2006 17:21 » 

Я бы попробовал написать прокси, который снаружи доступен с нормальным именем, а внутри вызывает функции из ReadEEPROM.dll. Чуть больше накладные расходы, но не придется на поклон к горе-разработчикам идти.

Кстати, почему аргументы,объявленные в прототипе как int, превратились при вызове в UInt16?
Записан
xelos
Гость
« Ответ #3 : 06-01-2006 17:39 » 

Я бы попробовал написать прокси, который снаружи доступен с нормальным именем, а внутри вызывает функции из ReadEEPROM.dll. Чуть больше накладные расходы, но не придется на поклон к горе-разработчикам идти.

Кстати, почему аргументы,объявленные в прототипе как int, превратились при вызове в UInt16?

разработчикам деньги платят, так что перекомпилируют. самому делать проксевую длл просто влом, т.к. ошибка не моя и за просто так деньги платить неохота.

поскольку все адреса и значения 16-и разрядные и беззнаковые, потому и UInt16 - перестраховка... это не проблема, больше интересует как
LPSTR * serial в C# будет выглядеть... сдается не так, как я написал... надо через
[MarshalAs(UnmanagedType.LPStr)] как-то делать... тока еще указать, что это указатель...
может:
[MarshalAs(UnmanagedType.LPStr)] ref serial?

жаль не могу протестить...
Записан
Alf
Гость
« Ответ #4 : 06-01-2006 17:58 » 

Я передавал char* из DLL в сборку .NET как string, никаких проблем не встретил.

А они в самом деле передают указатель на указатель на строку, так сложно?
Записан
xelos
Гость
« Ответ #5 : 06-01-2006 18:11 » 

я взял объявления из сопровождающей документации.
поскоку, функция возвращает строку, я сам в догадках зачем такие сложности воротить. потом попрошу это дело тоже переписать. работаем, с тем, что есть на данный момент - т.к. в понедельник прога полетит в ГонгКонг.
Записан
xelos
Гость
« Ответ #6 : 10-01-2006 09:51 » 

хмм, по поводу некорректных имен функций.
разработчики исправили все и сказали, что для исправления проблемы не ставили extern "C", а включили при компиляции файл .def... кто-нибудь может объяснить что они сделали?
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 11-01-2006 11:41 » 

возможно, в .def файле они связали umnagled имя  Read_Angel2_Info с mangled именем bla_ Read_Angel2_Info_bla_bla.  Посмотри в dumpbin, какие имена есть в секции Exports
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
xelos
Гость
« Ответ #8 : 22-01-2006 14:42 » 

Я передавал char* из DLL в сборку .NET как string, никаких проблем не встретил.

А они в самом деле передают указатель на указатель на строку, так сложно?

в общем исправили мне все о чем я говорил,

LPSTR * serial объявлялось как [MarshalAs(UnmanagedType.LPStr)] ref serial и все работало,

а char* просто как string не пошла, т.к. функция из dll возвращала указатель на строку, пришлось использовать StringBuilder
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines