C ++の構造体に値を割り当てる問題C#から渡された構造に
-
19-09-2019 - |
質問
C#の配列をC ++で書かれたDLLに渡す機能があります。構造体はINTのグループであり、DLLのデータを読み取ると、すべての値が正常に出てきます。ただし、C ++の要素に書き込もうとすると、読み取ろうとしてからC#に戻ると、値は表示されません。
C#
[StructLayout(LayoutKind.Sequential)]
struct Box
{
public int x;
public int y;
public int width;
public int height;
}
[StructLayout(LayoutKind.Sequential)]
struct Spot
{
public int x;
public int y;
}
static void TestCvStructs()
{
int len = 100;
Box[] r = new Box[len];
Spot[] p = new Spot[len];
for (int i = 0; i < len; i++)
{
r[i].x = i*10;
r[i].y = i * 200;
r[i].width = r[i].x * 10;
r[i].height = r[i].y * 100 + r[i].x * 5;
p[i].x = i * 8;
p[i].y = i * 12;
}
PassCvStructs(len, r, p);
for (int i = 0; i < len; i++)
{
Console.WriteLine("Point/x:{0} Boxes/x{1}", p[i].x, r[i].x );
}
}
[DllImport(dll)]
private static extern int PassSomeStructs(int count, Box[] boxes, Spot[] points);
C ++
typedef struct Box
{
int x;
int y;
int width;
int height;
} Box;
typedef struct Spot
{
int x;
int y;
} Spot;
CPPDLL_API int PassSomeStructs(int arrayLength, Box *boxes, Spot *points)
{
for(int i = 0; i < arrayLength; ++i)
{
printf("Group:%i\n", i);
printf("Rect - x:%i y:%i width:%i length:%i\n", boxes[i].x, boxes[i].y, boxes[i].width, boxes[i].height);
printf("Point - x:%i y:%i\n", points[i].x, points[i].y);
printf("\n");
points[i].x = 3;
boxes[i].x = 1;
}
return 0;
}
解決 3
別の質問に投稿された答えを見つけました: C#の構造体の配列をマーシャルする方法は?
マーシャリングのように見える場合は、デフォルトがパラメーターをマーシャルすることです。それ以外の場合は、それらを明示的に宣言する必要があります。そのコードを明示的に指定した後、この例は機能します。
彼に感謝します キートネス 答えとへ アントンマルコフ マーシャラへの暴露のため。
private static extern int PassSomeStructs(int count, [In, Out] Box[] boxes, [In, Out] Spot[] points);
他のヒント
から MDSNの記事 マーシャリングアレイ:アレイタイプに次の属性を設定してみてください。これは通常、C ++からC#を呼び出すために使用されますが、更新された値をC#に戻すためにも必要になる場合があります。
[DllImport(dll)]
private static extern int PassSomeStructs(int count,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] Box[] boxes,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] Spot[] points);
また、双方向のマーシャルが成功した例については、この記事も参照してください。
ref/outキーワードをc#externに追加してみましたか?
別のアイデアは、クラス自体の代わりにINTPTRを渡すか、intptrのように渡すことです...
私は、構造体はコピーされていると信じており、デフォルトで参照によって渡されるわけではないと考えています。
正直に暗闇を刺しますが、まだ答えがありませんので、うまくいけばこれが役立ちます...
Interopはまだ私にとって「It's Magic」段階にあります...
所属していません StackOverflow