我正在 C# 中的非托管 dll 函数 swe_get_planet_name() 上使用 P/invoke。 给定的函数定义是,
char* swe_get_planet_name(int ipl, char *spname);
这意味着返回值赋给了char *spname?从文档中的示例代码来看似乎是这样。
char snam[40];
/*
* get the name of the planet p
*/
swe_get_planet_name(p, snam);
/*
* print
*/
printf(snam);
所以我的 C# 代码是
[DllImport("swedll32.dll")]
private static extern void swe_get_planet_name(int ipl, char[] spname);
char[] name = new char[40];
int p = 3;
swe_get_planet_name(p, name);
执行时没有错误,但变量“name”在每个项目中被分配了一个无意义的“\0”,而不是它应该返回的行星名称。由于供应商提供的示例应用程序运行顺利,因此 DLL 没有任何问题。有什么想法吗?
最佳答案
它看起来是一个非常弱且危险的 C 接口(interface),没有传递大小参数。
这里的正常模式是提供一个 Stringbuilder 来接收文本,并让编码(marshal)拆收器发挥作用。
[DllImport("swedll32.dll")]
private static extern void swe_get_planet_name(int ipl, StringBuilder spname);
//char[] name = new char[40];
StringBuilder name1 = new StringBuilder(40); // the 40 may be usefuul, not sure
int p = 3;
swe_get_planet_name(p, name1);
string name = name1.ToString();
关于c# - pInvoke C# DLL导入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3645847/