私はこれをテストしていないので、いくつかの変更が必要かもしれませんが、ここに私が手にしたものがあります.
まず、STRUCT
次のように宣言する必要があります。
struct STRUCT
{
public UInt32 length;
}
オブジェクトのメモリ レイアウトが既知であり、C コードが期待するものと一致するように、class
から に変更したことに注意してください。struct
アップデート
もう少し検討した後、メソッドを宣言して呼び出す簡単な方法があります。別の方法については、元の回答を以下に残します。
P/Invoke 署名は次のようになります。
[DllImport(LINUXLIB, CallingConvention=CallingConvention.Cdecl)]
public static extern int simpletran(ref STRUCT req);
は値型であり、C コードはその構造体へのポインターを必要とするため、に変更STRUCT
したことに注意してください。ref STRUCT
STRUCT
そして、あなたはそれを次のように呼びます:
STRUCT st = new STRUCT();
st.length = (UInt32)100;
simpletran(ref st);
オリジナル
[DllImport(LINUXLIB, CallingConvention=CallingConvention.Cdecl)]
public static extern int simpletran(IntPtr req);
値型でなければならず、C コードはその構造体へのポインターを必要とするため、に変更STRUCT
したことに注意してください。IntPtr
STRUCT
そして、あなたはそれを次のように呼びます:
STRUCT st = new STRUCT();
st.length = (UInt32)100;
IntPtr ptr = Marshal.AllocHGlobal(sizeof(STRUCT));
Marshal.StructureToPtr(st, ptr, false);
simpletran(ptr);
Marshal.FreeHGlobal(ptr);
インスタンスの作成と、構造体の値を格納するためのアンマネージ メモリのチャンクを割り当てるメソッドの呼び出し ( Marshal.AllocHGlobal )の間に追加の手順を追加し、Marshal.StructureToPtr(...)st
を使用してそのメモリに値をコピーします。 . Marshal.FreeHGlobalを呼び出して、呼び出し後に割り当てられたメモリを必ず解放してください。