私のC宣言は次のとおりです。
int myData(uint myHandle, tchar *dataName, long *Time, uint *maxData, DATASTRUCT **data);
typedef struct {
byte Rel;
__int64 Time;
char Validated;
unsigned char Data[1];
} DATASTRUCT ;
私のC#宣言は次のとおりです。
[DllImport("myData.dll", EntryPoint = "myData")]
public static extern int myData(uint myHandle, [MarshalAs(UnmanagedType.LPTStr)] string dataName, out long Time, out uint maxData, ref DATASTRUCT[] data);
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DATASTRUCT
{
public sbyte Rel;
public long Time;
public byte Validated;
public double Data;
}
次に、マネージ関数を次のように呼び出します。
string dataToShow = "description";
long Time;
uint maxData; // How many structs will be returned, i.e. how much data is available
uint myHandle = 1;
DATASTRUCT[] dataInformation = new DATASTRUCT[3]; // doesn't matter what I specify as the array size?
myData(myHandle, dataToShow, out Time, out maxData, ref dataInformation);
上記の関数を実行すると、返される構造が 3 つあるにもかかわらず、構造が 1 つだけで正常に返されます。これはなぜですか?
追加情報; 次の方法で、ポインターを構造体の配列のポインターに渡そうとしました。
- ref DATASTRUCT[] data; // Works but only returns one struct
- [Out, MarshalAs(UnmanagedType.LPArray)] DATASTRUCT[] data; // returns the number of defined structs with garbage
を使用して手動でマーシャリングを行う必要があるかもしれないことは理解していますIntPtr
が、これを実装する方法がわからないため、アドバイスをいただければ幸いです。