从C+访问C#中的一行主要参数+;动态链接库 我尝试从C++ DLL访问坐标系参数到我的C项目中。 C++中的函数声明如下: unsigned int GetUCS(IUnknown* document, unsigned int id, double (&frame)[16]);

从C+访问C#中的一行主要参数+;动态链接库 我尝试从C++ DLL访问坐标系参数到我的C项目中。 C++中的函数声明如下: unsigned int GetUCS(IUnknown* document, unsigned int id, double (&frame)[16]);,c#,c++,pinvoke,marshalling,C#,C++,Pinvoke,Marshalling,我需要有关帧参数的帮助,该参数是行主参数: [Right_x, Up_x, Forward_x, Translation_x] [Right_y, Up_y, Forward_y, Translation_y] [Right_z, Up_z, Forward_z, Translation_z] [0, 0, 0, 1 ] 在我的C#项目中,我必须有如下内容: [DllImport("my.dll", CallingCo

我需要有关帧参数的帮助,该参数是行主参数:

  [Right_x, Up_x, Forward_x, Translation_x]
  [Right_y, Up_y, Forward_y, Translation_y]
  [Right_z, Up_z, Forward_z, Translation_z]
  [0,       0,    0,         1            ]
在我的C#项目中,我必须有如下内容:

  [DllImport("my.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] 
  private static extern uint GetUCS([MarshalAs(UnmanagedType.IUnknown)] object document, uint id, double(frame)?));
接收帧并在此基础上进行一些3D变换。谢谢大家!

我想我应该使用这样的C#多维数组:

[DllImport("my.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern uint GetUCS(
    [MarshalAs(UnmanagedType.IUnknown)] object document, 
    uint id, 
    [In, Out] double[,] frame
);
double[,] frame = new double[4, 4];
您可以在C代码中分配数组,如下所示:

[DllImport("my.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern uint GetUCS(
    [MarshalAs(UnmanagedType.IUnknown)] object document, 
    uint id, 
    [In, Out] double[,] frame
);
double[,] frame = new double[4, 4];

同样可以使用<代码>双[]帧< /> >分配为<代码>新的双(16)< /Cord>,它将与C++代码逐字匹配,但是你将失去在C代码中自然访问矩阵的能力。 尝试

[In,Out]双[]帧
并传递一个已分配的
双[16]
。PS:CharSet=CharSet.Unicode在这里似乎没用。@simon这应该是
[In,Out]double[,]
,然后用
新的double[4,4]
分配给它,非常感谢!我会测试你的反应!!C++中的一维数组对“行主要”没有定义。也不是在C#中。使用column+row*width计算索引是映射索引的明显方式,实际上是编译器执行此操作时发生的情况。事实上,在C#中实现这一点的更快方法是,多维数组在运行时要比锯齿状数组丑陋得多。双精度是指在连续内存中读取16*8=128字节的8字节。如果声明double或double[],则不会对结果产生影响,除非要将结果直接放入一维数组或二维数组中。结果;ts将是非托管的,因此我将使用[Marshallas(UnmanagedType.I8)]double[]frame非常感谢!!如果我能收到正确的UCS参数,我很好奇。带着结果和结论回来!C#多维数组是连续的,并且按行的主要顺序排列,因此这将按需要运行