Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pInvoke C#DLLimport问题_C#_.net_Pinvoke_Dllimport - Fatal编程技术网

pInvoke C#DLLimport问题

pInvoke C#DLLimport问题,c#,.net,pinvoke,dllimport,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); /* * pr

我在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代码是


此操作执行时没有错误,但变量“name”在每个项中都分配了一个无意义的“\0”,而不是它应该返回的行星名称。DLL没有问题,因为供应商提供的示例应用程序工作顺利。有什么想法吗?

它看起来是一个非常脆弱和危险的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();

您是否尝试过传入指向字节数组而不是char[]的指针?我相信这将以不同的方式进行封送。最好将返回类型声明为IntPtr,因为原始函数返回指针。
[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();