我正在尝试使用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.0
或3840.0
,这告诉我要么在复制时使用指针错误,要么有其他可疑的东西。 DLL中的代码正常工作,因为有另一个用C编写的程序可以获得正确的值。感觉就像我制作指针的浮动而不是指向它。
答案 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中调用另一个函数,以使其具有要处理的值。添加该调用后,一切都运行良好。