C# 在C+;中为结构赋值时出现问题+;到从C传递的结构# 我在C语言中有一个函数,它把一组结构传递到一个用C++编写的DLL中。结构是一组整数,当我读取DLL中的数据时,所有的值都很好。但是,如果我尝试写C++元素,那么当我试图读取时,值永远不会出现,然后回到C。

C# 在C+;中为结构赋值时出现问题+;到从C传递的结构# 我在C语言中有一个函数,它把一组结构传递到一个用C++编写的DLL中。结构是一组整数,当我读取DLL中的数据时,所有的值都很好。但是,如果我尝试写C++元素,那么当我试图读取时,值永远不会出现,然后回到C。,c#,c++,dll,struct,interopservices,C#,C++,Dll,Struct,Interopservices,C# [StructLayout(LayoutKind.Sequential)] 结构盒 { 公共int x; 公共智力; 公共整数宽度; 公众内部高度; } [StructLayout(LayoutKind.Sequential)] 结构点 { 公共int x; 公共智力; } 静态void TestCvStructs() { int len=100; 方框[]r=新方框[len]; 点[]p=新点[len]; 对于(int i=0;i

C#

[StructLayout(LayoutKind.Sequential)]
结构盒
{
公共int x;
公共智力;
公共整数宽度;
公众内部高度;
}
[StructLayout(LayoutKind.Sequential)]
结构点
{
公共int x;
公共智力;
}
静态void TestCvStructs()
{
int len=100;
方框[]r=新方框[len];
点[]p=新点[len];
对于(int i=0;i
C++

typedef结构框
{
int x;
int-y;
整数宽度;
内部高度;
}盒子;
类型定义结构点
{
int x;
int-y;
}斑点;
CPPDLL_API int PASSSOMETSTRUCTS(int arrayLength、Box*Box、Spot*points)
{
对于(int i=0;i
您是否尝试将ref/out关键字添加到C#extern中

另一个想法是尝试传递一个IntPtr而不是类本身,或者作为一个IntPtr传递它

我相信结构是复制的,默认情况下不是通过引用传递的

老实说,在黑暗中刺伤,但你还没有任何答案,所以希望这有帮助

Interop对我来说仍然处于“它的魔力”阶段…

来自编组数组的一个实例:尝试在数组类型上设置以下属性。这通常用于调用C++中的C ^,但也可能需要将更新的值返回到C ^中。

另请参阅本文,了解成功的双向编组示例:


我在另一个问题上找到了答案:

在封送处理时,默认情况是封送参数,如中所示。否则,它们需要显式声明为Out或In,Out。在明确指定了我的代码之后,示例现在可以工作了

感谢他的回答和对马绍拉斯的曝光

private static extern int PassSomeStructs(int count, [In, Out] Box[] boxes, [In, Out] Spot[] points);

从行为上看,它似乎是通过引用传递的。当我尝试使用REF时,我会在C++端得到疯狂的值,就像值实际上是指针一样。如果我将接收类型更改为指针到指针,我会得到一个内存访问异常:(我将把所有数据打包到一个int数组中,并传递给它,因为这是一个“魔法”让我感到沮丧。好了,我们知道这与C#如何声明外部有关。我可以使用LPArray获得相同的结果,使用SafeArray或ByValArray会导致错误。使用另一个值会产生错误,表示数组只能使用前面三种类型。
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;
}
[DllImport(dll)]
private static extern int PassSomeStructs(int count, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] Box[] boxes, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] Spot[] points);
private static extern int PassSomeStructs(int count, [In, Out] Box[] boxes, [In, Out] Spot[] points);