gpt4 book ai didi

c# - pInvoke C# DLLimport 问题

转载 作者:行者123 更新时间:2023-11-30 21:19:48 26 4
gpt4 key购买 nike

我在 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);

这执行没有错误,但变量“名称”在每个项目中分配了一个无意义的“\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# DLLimport 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3645847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com