将DLLImport与char **和float **一起使用

时间:2013-10-14 14:16:44

标签: c# dll pinvoke dllimport

我正在尝试使用DLLImport在C#程序中使用DLL文件。 我在DLL中有以下功能:

int method(char* method, char** params, int n_params, float** res_arr, int* n_res);

函数调用应该是这样的:

method   = "method1"
char**   = {"param1=1", "param2=2"}
n_params = 2
res_arr  = the DLL function allocates an array and points this to it
n_res    = the DLL function sets to the number of results

有一个单独的功能可以释放浮子** 我在C#中的当前代码是:

private static extern int method(string method, ref IntPtr params, Int32 n_params, ref IntPtr res_arr, IntPtr n_res);

我是C#的新手(而且我的C知识有点缺乏)并且在我的生活中可能无法弄清楚如何调用此功能(已经对我的键盘进行了两天的面部植入)。有人能给我一个如何做到这一点以及如何调用函数的例子吗?

我的主要问题是如何处理char**float**,我不知道它是否是声明中的正确指针类型,并且不知道我应该如何创建并将我的char**发送给该函数。

值得注意的是,我可能不会更改DLL文件中的任何内容。

修改
这是释放结果数组的函数的描述:

free_results(float* res_arr)

EDIT2 我现在可以调用该方法并获得值,我现在的问题是我似乎在访问浮点值时遇到问题。如我所知,我正在使用Marshal.Copy()这样:

[DllImport("libs\\myDll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int method(string method, string[] params, Int32 n_params, out IntPtr res_arr, ref int n_res);

IntPtr res_arr = IntPtr.Zero;  
int n_res = 0;
string[] s = new string[] { "param1" };  

method("analyze", s, s.Length, out res_arr, ref n_res);  

float[] f_res = new float[n_res];
Marshal.Copy(res_arr, f_res, 0, n_res);

问题是我似乎只在float向量中得到垃圾值。例如,在一种情况下,我应该得到100.0,但得到15.03840.0,这告诉我要么在复制时使用指针错误,要么有其他可疑的东西。 DLL中的代码正常工作,因为有另一个用C编写的程序可以获得正确的值。感觉就像我制作指针的浮动而不是指向它。

1 个答案:

答案 0 :(得分:2)

这是解决我最初问题的代码(正如Hans Passant所建议的那样):

[DllImport("libs\\myDll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int method(string method, string[] params, Int32 n_params, out IntPtr res_arr, ref int n_res);

IntPtr res_arr = IntPtr.Zero;  
int n_res = 0;
string[] s = new string[] { "param1" };  

method("analyze", s, s.Length, out res_arr, ref n_res);  

float[] f_res = new float[n_res];
Marshal.Copy(res_arr, f_res, 0, n_res);

我的第二个问题,浮点数组给出了垃圾值,这是我完全屁股的结果。在使用method(...)之前,必须在DLL中调用另一个函数,以使其具有要处理的值。添加该调用后,一切都运行良好。

相关问题