1
我无法得到下面的p/invoke代码工作,请帮助,谢谢。pinvoke - 传递一个字符串[]作为参数
下面的顶点在C++调用后保持为空。我试过使用IntPtr而不是string [],IntPtr在C++调用后保持为0。
C++代码
extern "C" __declspec(dllexport)
float compute_similarity(char** vertices)
{
vertices = new char*[2];
vertices[0] = new char[3];
vertices[1] = new char[3];
strcpy(vertices[0], "he");
strcpy(vertices[1], "ha");
return 1.01;
}
C#代码
[DllImport("demo.dll", EntryPoint = "compute_similarity",
CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
static extern float compute_similarity(out string[] vertices);
//also tried 'static extern float compute_similarity(out IntPtr vertices);'
public string Func()
{
string[] vertices; //also tried 'IntPtr vertices'
float sim = compute_similarity(out vertices);
//break point here vertices stays null(or 0 for IntPtr)
return sim.ToString();
}
无法看到您的C++代码的问题。我复制/粘贴它,并替换传递参数与本地字符**,它为我工作得很好。你如何调用函数compute_similarity()? (你传递给它的是什么?) –
这段代码不能可靠地从C++调用,当你从C#调用它时,它不会变得更好。调用者*有*调用delete []来获取释放数组的内存。这有时可以从C++起作用,你需要相当的运气并仔细控制DLL和客户端代码所使用的编译器版本。它保证不能从C#工作,它不知道如何调用C++ delete []运算符。你得到0是因为你的C++代码不好,vertices参数应该是char ***。 –
首先让你的函数适用于C++客户端。它看起来像你需要char *** - 伟大的设计! –