3

DLL に小さな C ライブラリがあり、そのメソッドをいくつか呼び出す必要があります。

ポインターといくつかの構造体を使用しますが、それ以外は非常に単純です。問題は、私が管理されていない世界との .NET の相互運用性について十分に知識がなく、これまでの試行でメモリ アクセス違反の例外が発生し続けていることです (おそらく、ポインターを正しく取得していないため)。

これにアプローチするための最良の方法について、誰かが私にいくつかの指針を教えてくれますか?

ありがとうございました

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;
4

3 に答える 3

5

このMSDNMagazineの記事に記載されている、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) ;

}
于 2008-12-11T16:01:30.370 に答える
1

長くて役立つ回答を書きましたが、投稿したときに StackOverflow が破棄しました。

要点は次のとおりです。

  1. サイト pinvoke.net が役立つ場合もありますが、常に正確であるとは限りません。
  2. .NET フレームワークのソースは、Win32 関数の正しい p/invoke シグネチャの非常に便利なリポジトリであり、私自身の p/invoke 問題についてしばしばインスピレーションを与えてくれました。
  3. Marshal クラスには、多くの便利な関数が含まれています。その中には、IntPtr で実際に行うことなどを説明するのに役立つものもあります。

また、固定/ピン留めについても注意が必要な場合があります。特に、リンクされたリスト構造のようなものでは、マネージド アプリでどのように使用されるかわかりません。

于 2008-12-11T16:38:46.520 に答える
1

マネージド コードとアンマネージド コードの間の相互運用性は非常にシームレスであるため、C++/CLI でラッパーを作成する必要があるかもしれません。

アップデート

簡単な例へのリンクを次に示します。C# の List> を模倣する C データ構造?

于 2008-12-11T14:37:36.670 に答える