C#调用c++Dll 结构体数组指针的问题

时间:2022-08-30 20:00:48

参考文章http://blog.csdn.net/jadeflute/article/details/5684687

但是这里面第一个方案我没有测试成功,第二个方案我感觉有点复杂。

然后自己写啦一个:

第一:c++ 方法的结构数组参数设置为指针,指向第一个元素的地址。定义结构体。

typedef struct 

{
float X;

float Y;


}Point_2F;
extern "C" __declspec(dllexport) bool GetPoints(char *s,Point_2F *arr);
for(int i=0;i<4;i++)//在方法体内赋值
{
Point_2F f;
f.X
=i+1;
f.Y
=i+2;
arr[i]
=f;
}

 

第二:c#调用声明c++方法时,设置传入的参数为指针类型,也就是IntPtr。定义结构体。

    [StructLayout(LayoutKind.Sequential)]
public struct Point_2F
{
public float X;
public float Y;

};

 

[DllImport("dll名子", EntryPoint = "GetPoints", CallingConvention = CallingConvention.Cdecl)]
static extern bool GetPoints(string s, IntPtr arr);//错误应该返回byte类型
    Point_2F[] arrP = new Point_2F[4];
arrP[
0] = new Point_2F();
arrP[
0].X = 100;
arrP[
0].Y = 100;
IntPtr ptr
= System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(arrP, 0);//获取地址
bool ret = GetPoints(s, ptr);//数值里面值发生改变。

这样是不是简单点呢?不知道这样是否存在其他问题,比如操作系统环境,还有其他我没想到的。

(PS:中间有一个错误,就是C++中bool占一个字节,C#中bool占4个字节,所以C声明方法应该返回byte类型。)

当然也可以有个变通的方案.不用new来申请数组 用stackalloc
比如Point_2F* array = stackalloc Point_2F[2];//这个是要求在c#非安全代码的上下文的
这样可以直接在栈区申请数组并获得指针(类似C语言的静态数组了...但是要考虑你这个对象的生命周期)