1

我正在尝试使用 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.0or 3840.0,这告诉我要么我在复制时使用了错误的指针,要么还有其他可疑的东西。DLL 中的代码正常工作,因为有另一个用 C 语言编写的程序可以获取正确的值。感觉就像我在浮动指针而不是它指向的地方。

4

1 回答 1

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);

我的第二个问题是浮点数组给出了垃圾值,这是因为我是一个完整的混蛋。DLL 中有另一个函数必须在使用之前调用method(...),以便它具有要处理的值。添加该调用后,一切正常。

于 2013-10-16T09:40:09.257 回答