我正在尝试使用 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**
and 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);
问题是我似乎只在浮点向量中得到垃圾值。例如,在一种情况下,我应该得到100.0
但得到15.0
or 3840.0
,这告诉我要么我在复制时使用了错误的指针,要么还有其他可疑的东西。DLL 中的代码正常工作,因为有另一个用 C 语言编写的程序可以获取正确的值。感觉就像我在浮动指针而不是它指向的地方。