DllImport в C#
От: Silent_Sky Россия http://www.rsdn.ru/tools/member.aspx?id=
Дата: 23.09.09 12:47
Оценка:
Доброго времени!

Есть некая SmartBot.dll

имеется заголовочный файл для импорта интерфейсных функций

#define _IMPORT_EXPORT_ __declspec(dllimport)

_IMPORT_EXPORT_ const char * PASCAL GetReplyTo ( const char * pszInText );
_IMPORT_EXPORT_ int PASCAL LoadMind(char * pszMindFile);


как мне правильно объявить эти функции в c# ?

я пробовал так


[DllImport("SmartBot.dll", EntryPoint = "GetReplyTo")]
public static extern string GetReplyTo(string strQuestion);

[DllImport("SmartBot.dll", EntryPoint = "LoadMind")]
public static extern int LoadMind(string fileName);


"LoadMind" — молча отрабатывает вроде как бы нормально все,
а вот при попытке вызова "GetReplyTo" падает исключение:

System.AccessViolationException was unhandled
  Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."


Подскажите как правильно объявить и вызвать данную функцию?
Когда-нибудь и я буду много знать, но пока это не грозит...
ICQ #134433
Re: DllImport в C#
От: Silent_Sky Россия http://www.rsdn.ru/tools/member.aspx?id=
Дата: 23.09.09 12:57
Оценка:
Есть мнение что и LoadMind отрабатывает неправильно. Ибо возвращает 1.
Когда-нибудь и я буду много знать, но пока это не грозит...
ICQ #134433
Re: DllImport в C#
От: andrewr  
Дата: 23.09.09 13:03
Оценка:
Если я правильно помню, то под const char* не string подставляется, а IntPtr, а там уже от этого надо плясать.
Re[2]: DllImport в C#
От: andrewr  
Дата: 23.09.09 13:13
Оценка:
Здравствуйте, Silent_Sky, Вы писали:

S_S>Есть мнение что и LoadMind отрабатывает неправильно. Ибо возвращает 1.


Ну или, как вариант, могут быть различия по кодировке в шарпе и твоей длл-ине. Собственно акцесс виолейшен и вылетает по этой причине. Ну, например, ты передаешь ANSI, а обработка внутри функции ведется как по юникоду. Собсно на ANSI один байт — один символ, unicod — 2 байта. Ессно указатель может попадать на пустое место. Вобщем, тут надо смотреть более конкретно.
Re: DllImport в C#
От: Аноним  
Дата: 23.09.09 14:19
Оценка:
Здравствуйте, Silent_Sky, Вы писали:

Кто отвечает за выделение/освобождение памяти и кто как работает с этой памятью?

Мне кажется, что падает т.к. CLR пытается освободить память результат выполнения функции GetReplyTo
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.