2008-12-11 3 views
3

У меня есть небольшая библиотека C в DLL, и мне нужно вызвать несколько ее методов.Взаимодействие между C# и неуправляемой библиотекой C

Он использует указатели и несколько структур, но в остальном довольно прост. Проблема в том, что я не очень хорошо осведомлен о взаимодействии .NET с неуправляемым миром, и мои попытки до сих пор продолжают нарушать исключения доступа к памяти (предположительно из-за того, что я не получаю правильные указатели).

Может ли кто-нибудь дать мне несколько указателей (ooh pun!) На лучший способ приблизиться к этому?

Спасибо

extern vconfig_t *Pobsopen(Ppoly_t ** obstacles, int n_obstacles); 


extern int Pobspath(vconfig_t * config, Ppoint_t p0, int poly0, 
      Ppoint_t p1, int poly1, 
      Ppolyline_t * output_route); 

extern void Pobsclose(vconfig_t * config); 

struct vconfig_t { 
    int Npoly; 
    int N; 
    Ppoint_t *P; 
    int *start; 
    int *next; 
    int *prev; 
}; 

typedef struct Ppoly_t { 
    Ppoint_t *ps; 
    int pn; 
} Ppoly_t; 

typedef Ppoly_t Ppolyline_t; 

typedef struct Pxy_t { 
    double x, y; 
} Pxy_t; 

typedef struct Pxy_t Ppoint_t; 
typedef struct Pxy_t Pvector_t; 

ответ

1

Может быть, вы должны написать обертку в C++/CLI, поскольку Interop между управляемым кодом и неуправляемым кодом очень гладко.

Update

Вот ссылка на тривиальный пример: C data structure to mimic C#’s List>?

5

Вы должны проверить tool приведенные в этой MSDN Magazine article, который может перевести на C фрагмент кода на C# P/Invoke подписей, и, конечно же, должность.

Запуск инструмента для вашего фрагмента кода дает вам следующее:

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] 
public struct vconfig_t { 

    /// int 
    public int Npoly; 

    /// int 
    public int N; 

    /// Ppoint_t* 
    public System.IntPtr P; 

    /// int* 
    public System.IntPtr start; 

    /// int* 
    public System.IntPtr next; 

    /// int* 
    public System.IntPtr prev; 
} 

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] 
public struct Ppoly_t { 

    /// Ppoint_t* 
    public System.IntPtr ps; 

    /// int 
    public int pn; 
} 

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] 
public struct Pxy_t { 

    /// double 
    public double x; 

    /// double 
    public double y; 
} 

public partial class NativeMethods { 

    /// Return Type: vconfig_t* 
    ///obstacles: Ppoly_t** 
    ///n_obstacles: int 
    [System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="Pobsopen")] 
public static extern System.IntPtr Pobsopen(ref System.IntPtr obstacles, int n_obstacles) ; 


    /// Return Type: int 
    ///config: vconfig_t* 
    ///p0: Ppoint_t->Pxy_t 
    ///poly0: int 
    ///p1: Ppoint_t->Pxy_t 
    ///poly1: int 
    ///output_route: Ppolyline_t* 
    [System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="Pobspath")] 
public static extern int Pobspath(ref vconfig_t config, Pxy_t p0, int poly0, Pxy_t p1, int poly1, ref Ppoly_t output_route) ; 


    /// Return Type: void 
    ///config: vconfig_t* 
    [System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="Pobsclose")] 
public static extern void Pobsclose(ref vconfig_t config) ; 

} 
1

Я написал длинный и полезный ответ, который отбрасывается StackOverflow, когда я отправил его.

Суть была:

  1. Вы можете найти сайт pinvoke.net полезным, хотя это не всегда точны.
  2. Источник .NET framework - очень полезный репозиторий правильных подписи p/invoke для функций Win32 и часто давал мне вдохновение для моих собственных проблем p/invoke.
  3. Класс Marshal содержит много полезных функций - некоторые из которых могут помочь объяснить такие вещи, как то, что вы на самом деле делаете с IntPtr.

Возможно, вам также необходимо быть осторожным в отношении фиксированного/пиннинга - особенно с чем-то вроде структуры связанного списка, подумал, что я не уверен, как он будет использоваться в вашем управляемом приложении.

Смежные вопросы