C# Маршалинг структуры. Кидается исключение
От: bitwise  
Дата: 21.04.08 05:45
Оценка:
Всем привет!

Я пишу обертку на 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 );
}



Так вот я не понимаю, почему отрабатывает вызов первой функции и не отрабатывает вызов второй. Помогите пожалуйста, че-то я никак не соображу где ошибся. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.