※前提条件:本情報はOpenCV3.1を基づいて説明してる C++側は以下のようにstructを宣言する extern "C" { struct MyStruct { char* id; char* description; }; } C++側は以下のようにstructを返すメソッドを作成する __declspec(dllexport) MyStruct* __stdcall get_my_structures() { static MyStruct a[] = { { "id1", "desc1" }, { "id2", "desc2" }, { "id3", "desc3" } }; return a; } C#側は以下のように呼び出し取得する using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public class MyStruct { [MarshalAsAttribute(UnmanagedType.LPStr)] public string _id; [MarshalAsAttribute(UnmanagedType.LPStr)] public string _description; } class Program { [DllImport("dll")] static extern IntPtr get_my_structures(); static void Main() { int structSize = Marshal.SizeOf(typeof(MyStruct)); Console.WriteLine(structSize); IntPtr myStructs = get_my_structures(); for (int i = 0; i < 3; ++i) { IntPtr data = new IntPtr(myStructs.ToInt64() + structSize * i); MyStruct ms = (MyStruct) Marshal.PtrToStructure(data, typeof(MyStruct)); Console.WriteLine(); Console.WriteLine(ms._id); Console.WriteLine(ms._description); } } } 配列内要素の個数の取得に、いい方法がなく、現在Structの中にsize変数を用意して、C#側ではそれを取得してから利用する方法で実現する。 ★月額105円~/容量最大30GB/機能満載! ロリポップ!レンタルサーバー ★ コメント: |