将分配给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);
另请参阅本文以获取成功的双向编组的示例:
您是否尝试在C#Extern中添加Ref/Out关键字?
另一个想法是尝试通过INTPTR而不是类本身传递,或以-s- intptr ...将其传递。
我相信结构是复制的,默认情况下不是通过引用通过。
诚实地在黑暗中刺伤,但您还没有任何答案,所以希望这会有所帮助...
Interop对我来说仍然处于“魔术”阶段。
不隶属于 StackOverflow