c# 调用c++ dll 返回值为数组指针

时间:2022-08-31 09:11:23
     如果c++dll的函数返回值为 数组指针,c#这边我需要怎么定义函数,怎么接收呢?
c++:_declspec (dllexport) float* WINAPI shuju(float pv1[],float pv2[],float pv3[],float pv4[])

9 个解决方案

#1


返回数组名称就好了。

#2



[DllImport("sqlite3.dll", EntryPoint = "sqlite3_open",CallingConvention=CallingConvention.Cdecl)]
public static extern IntPtr shuju(float[] pv1,float[] pv2,float[] pv3,float[] pv4);

#3


先试试2楼的办法吧。

#4


引用 2 楼 sdl2005lyx 的回复:
C# code

[DllImport("sqlite3.dll", EntryPoint = "sqlite3_open",CallingConvention=CallingConvention.Cdecl)]
public static extern IntPtr shuju(float[] pv1,float[] pv2,float[] pv3,float[] pv4);

这个方法我试过,但是 InPre inpre=shuju(a,b,c,d);
console.write(inpre);
好像得出的是八位的地址,我该怎么得出我想要的数值呢?

#5



[DllImport("sqlite3.dll", EntryPoint = "sqlite3_open",CallingConvention=CallingConvention.Cdecl)]
public static extern float[] shuju(float[] pv1,float[] pv2,float[] pv3,float[] pv4);

......
float[] fs = shuju(a,b,c,d);
console.write(fs[0]);

#6


"这个方法我试过,但是 InPre inpre=shuju(a,b,c,d);
console.write(inpre);
好像得出的是八位的地址,我该怎么得出我想要的数值呢?"

使用这个:Marshal.Copy 方法 (IntPtr, Single[], Int32, Int32)
将数据从非托管内存指针复制到托管单精度浮点数组。 

public static void Copy (
IntPtr source,
float[] destination,
int startIndex,
int length
)

#7


使用float*.直接用不可以嘛?只要加一个unsafe。挺好的。不需要转换。也安全。

#8


不知道找到方法没?我也纠结于这个问题,难道一定要把返回值放入参数中传递吗?不能作为结果返回?

#9


借宝地向大家求教一下类似的问题。
我的问题是,函数返回值是结构体指针,C#这边代码不知道怎么写,加ref提示是不行的,
public static extern ref Struct myfun();
这么写是不行的,求高手指点。

#1


返回数组名称就好了。

#2



[DllImport("sqlite3.dll", EntryPoint = "sqlite3_open",CallingConvention=CallingConvention.Cdecl)]
public static extern IntPtr shuju(float[] pv1,float[] pv2,float[] pv3,float[] pv4);

#3


先试试2楼的办法吧。

#4


引用 2 楼 sdl2005lyx 的回复:
C# code

[DllImport("sqlite3.dll", EntryPoint = "sqlite3_open",CallingConvention=CallingConvention.Cdecl)]
public static extern IntPtr shuju(float[] pv1,float[] pv2,float[] pv3,float[] pv4);

这个方法我试过,但是 InPre inpre=shuju(a,b,c,d);
console.write(inpre);
好像得出的是八位的地址,我该怎么得出我想要的数值呢?

#5



[DllImport("sqlite3.dll", EntryPoint = "sqlite3_open",CallingConvention=CallingConvention.Cdecl)]
public static extern float[] shuju(float[] pv1,float[] pv2,float[] pv3,float[] pv4);

......
float[] fs = shuju(a,b,c,d);
console.write(fs[0]);

#6


"这个方法我试过,但是 InPre inpre=shuju(a,b,c,d);
console.write(inpre);
好像得出的是八位的地址,我该怎么得出我想要的数值呢?"

使用这个:Marshal.Copy 方法 (IntPtr, Single[], Int32, Int32)
将数据从非托管内存指针复制到托管单精度浮点数组。 

public static void Copy (
IntPtr source,
float[] destination,
int startIndex,
int length
)

#7


使用float*.直接用不可以嘛?只要加一个unsafe。挺好的。不需要转换。也安全。

#8


不知道找到方法没?我也纠结于这个问题,难道一定要把返回值放入参数中传递吗?不能作为结果返回?

#9


借宝地向大家求教一下类似的问题。
我的问题是,函数返回值是结构体指针,C#这边代码不知道怎么写,加ref提示是不行的,
public static extern ref Struct myfun();
这么写是不行的,求高手指点。