Всем привет!
Я пишу обертку на C# для С-библиотечки. Так вот, у меня есть структуры:
struct params
{
char* info;
params* next;
};
struct device
{
unsigned int flags;
char* name;
char* description;
params* p_params;
device* next;
};
И есть пара функций:
int get_device_list( device* dev );
void free_device_list( device* dev );
Так вот, что делаю я:
[StructLayout(LayoutKind.Sequential)]
public class device
{
[MarshalAs(UnmanagedType(UnmanagedType.U4)
uint flags;
[MarshalAs(UnmanagedType(UnmanagedType.LPStr)
string name;
[MarshalAs(UnmanagedType(UnmanagedType.LPStr)
string description;
IntPtr p_params;
IntPtr next;
public device()
{
name = new string( '\0', 100 );
description = new string( '\0', 100 );
flsgs = 0;
p_params = IntPtr.Zero;
next = IntPtr.Zero;
}
}
// Экспортирую ф-ции из DLL
[Dllimport("api.dll")]
static extern int get_device_list( IntPtr device_ptr );
[Dllimport("api.dll")]
static extern int free_device_list( IntPtr device_ptr );
public static void main()
{
device dev;
IntPtr device_ptr = Marshal.AllocHGlobal( Sizeof( typeof( device ) ) );
Marshal.StructureToPtr( dev, device_ptr, false ) );
int result = get_device_list( device_ptr ); // Здесь все хорошо
free_device_list( device_ptr ); // А здесь бросается исключение "Попытка чтения или записи в защищенную память. Возможно память повреждена"
Marshal.FreeHGlobal( device_ptr );
}
Так вот я не понимаю, почему отрабатывает вызов первой функции и не отрабатывает вызов второй. Помогите пожалуйста, че-то я никак не соображу где ошибся. Спасибо.