構造体配列をC++ DLLに渡して問題を実行しようとしています。私は無駄に数日間それを把握しようとしてきました。 C++からデータを得ることができますが、.NETを使用して構造体配列を取得しようとすると問題が発生します。構造体配列をC++ DLLからC++へ渡す
[StructLayout(LayoutKind.Sequential, Size = 23), Serializable]
public struct header
{
// HEADER
public UInt16 h_type;
public UInt32 frame_num;
public UInt16 count_1pps;
public byte data_options;
public byte project_type;
public byte tile_num;
public byte tile_set;
public byte total_rows;
public byte total_cols;
public byte num_rows;
public byte num_cols;
public byte first_row;
public byte first_col;
public UInt16 num_sensors;
public UInt16 num_data_bytes;
public byte h_checksum;
}
[StructLayout(LayoutKind.Sequential, Size = 25), Serializable]
public struct footer
{
// FOOTER
public UInt16 f_type;
public byte ts_len;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] ts_array;
public byte frame_status;
public byte f_checksum;
}
[StructLayout(LayoutKind.Sequential, Size = 51), Serializable]
public struct buffer_node
{
// HEADER
public header data_header;
// DATA
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] data;
// FOOTER
public footer data_footer;
}
:私の構造体は次のように定義されるbuffer_nodeある
[DllImport("SocketAPI.dll")]
static extern int api_get_data(int iSize, buffer_node[] data);
:
C++プロトタイプは次のとおりです。として私のC#コードで
static __declspec(dllexport) int SocketAPI::api_get_data(int iSize, buffer_node *data);
、私は機能を定義しました試してみたら、以下の輸入品:
私のC#のGetDataプログラムは、現在、次のようになります。
// Get current data size
int iSize = api_is_data_available();
// Create buffer to hold the data
buffer_node[] buf_data = new buffer_node[iSize];
for (int i = 0; i < iSize; i++)
{
buf_data[i].data = new byte[3];
buf_data[i].data_footer.ts_array = new byte[20];
}
// Get the data
//int iStructSize = Marshal.SizeOf(buf_data[0]);
//IntPtr bufNodePtr = IntPtr.Zero;
//IntPtr buffer = Marshal.AllocHGlobal(iStructSize * iSize);
//api_get_data(iSize, buffer);
//for (int i = 0; i < iSize; i++)
//{
// IntPtr ptr = new IntPtr(buffer.ToInt64() + iStructSize * i);
// buf_data[i] = (buffer_node)Marshal.PtrToStructure(ptr, typeof(buffer_node));
//}
//api_get_data(iSize, buf_data); // See buffer, but everything is 0 - ie. not being populated
// api_get_data(iSize, out buf_data); // fails no error
api_get_data(iSize, ref buf_data); // fails no error
// api_get_data(iSize, ref buf_data);
// Print the data
for (int i = 0; i < iSize; i++)
{
StringBuilder sb = new StringBuilder();
sb.Append("Tile Number: " + Convert.ToString(buf_data[i].data_header.tile_num));
AppendTextBox(sb.ToString());
}
ありがとうございました。どのような助けも大いにありがたく思えます。私は単純な仕事になるので、本当にループのために私を投げています!
こんにちは。ご返信ありがとうございます。私の好みは、安全なコードを使用することです。しかし、この時点で、私はそれが機能するようにしたい。私はあなたが「編集2」で書いたものを実装する方法を理解していません。ありがとう。 – user557615
私の編集を参照してください。 :) – Mehrdad
うーん... "アウト[アウト]"したかもしれない。私はもう少しテストをしなければならないでしょう。これはGoogleで検索するのは難しいことです。 [アウト]は何を意味しますか?それは外からどのように違いますか? – user557615