pInvoke C#DLLimport问题

时间:2010-09-05 11:09:39

标签: c# .net pinvoke dllimport

我在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没有任何问题,因为供应商提供的示例应用程序运行顺利。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

它看起来是一个非常弱且危险的C接口,没有传递大小参数。

这里的正常模式是提供一个Stringbuilder来接收文本,并让编组人员发挥它的魔力。

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