c# – PInvoke:返回的双精度数组的问题?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – PInvoke:返回的双精度数组的问题?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1273字,纯文字阅读大概需要2分钟。
内容图文
![c# – PInvoke:返回的双精度数组的问题?](/upload/InfoBanner/zyjiaocheng/723/c555d2e5806747c09df42d4115eb2837.jpg)
我正在使用PInvoke从我的C#程序中调用C函数.代码如下所示:
IntPtr data = Poll(this.vhtHand);
double[] arr = new double[NR_FINGERS /* = 5 */ * NR_JOINTS /* = 3*/];
Marshal.Copy(data, arr, 0, arr.Length);
Poll()的签名看起来像这样:
[DllImport("VirtualHandBridge.dll")]
static public extern IntPtr Poll(IntPtr hand);
C-function Poll的签名:
extern "C" __declspec(dllexport) double* Poll(CyberHand::Hand* hand)
除非我有一个巨大的脑力衰竭(诚然,对我来说相当普遍),这看起来像我应该工作.
但是,我得到的双值完全不正确,我认为这是因为内存使用不正确.我查了一下,我认为C#和C中的双打大小相同,但也许还有其他问题在这里播放.让我误解的一件事是,Marshal.Copy永远不会被告知它应该期望什么类型的数据,但我读到它应该以这种方式使用.
任何线索,任何人?如果需要,我可以发布正确的结果和返回的结果.
解决方法:
你缺少CallingConvention属性,它是Cdecl.
你真的想要支持更好的功能签名,由于内存管理问题,所需的手动封送,获得正确大小的数组的不确定性以及复制数据的要求,你所拥有的功能签名非常脆弱.始终支持调用者传递您的本机代码填充的缓冲区:
extern "C" __declspec(dllexport)
int __stdcall Poll(CyberHand::Hand* hand, double* buffer, size_t bufferSize)
[DllImport("foo.dll")]
private static extern int Poll(IntPtr hand, double[] buffer, int bufferSize)
使用int返回值报告状态代码.像负值一样报告错误代码,正值返回实际复制到缓冲区中的元素数.
内容总结
以上是互联网集市为您收集整理的c# – PInvoke:返回的双精度数组的问题?全部内容,希望文章能够帮你解决c# – PInvoke:返回的双精度数组的问题?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。