c# - pInvoke C# DLL导入问题

标签 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 没有任何问题。有什么想法吗?

最佳答案

它看起来是一个非常弱且危险的 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/

相关文章:

c# - Windows 8 空白应用 + DEP0700 错误

c# - Visual Studio 2008 中的工具栏开发

.net - 不同系统的企业集成

c# - C# 中的 typedef void* 替代方案

c# - 获取错误使用Timer类时跨线程操作

c# - 将用户控件添加到 Windows 窗体 C# 时出错

c# - 将 .nupkg 文件检入源代码管理 - 如何在构建时恢复?

.net - 处理 ViewModel 内的 WPF 对象

c# - 编码 SIZE_T* 的正确方法?

c# - pinvoke 返回一个 float