如何编组多维数组
Posted
技术标签:
【中文标题】如何编组多维数组【英文标题】:How to marshal multi-dimensional arrays 【发布时间】:2014-04-06 13:15:04 【问题描述】:我们有一些涉及矩阵的互操作代码。我试图调用本机 DLL,并且在大多数情况下它工作得非常可靠。
我依赖default marshalling by .net,避免使用非托管指针,而是在大多数情况下使用.net 数组,并且可能在这里和那里使用byref
。 .net 文章说,多维数组被隐式编组为以列为主的一维数组,这很好。
似乎唯一不起作用的是试图编组一个多维数组,因为 F# 编译器抱怨 float[,]
不允许在 extern
声明中。有没有办法绕过这个限制?
我知道 F# PowerPack 中的 PinnedArray
和 PinnedArray2
类型,但我一直在寻找一种依赖托管指针的解决方案,而且 - 更重要的是 - 我希望避免将 F# PowerPack 包含为PinnedArray
类的依赖项。
【问题讨论】:
我怀疑这篇文章指的是 C 意义上的多维数组。我对C不太熟悉,但是多维C数组不使用类似于.NET交错数组的语法吗?我不认为 C 有类似float[,]
的东西。那你试过float[][]
吗?
根据文章,锯齿状数组不能被隐式编组,多维数组应该可以被编组。
你没有考虑过关注点分离吗?您可以在 F# 端组织业务逻辑,让 C# 组件负责互操作、通信和其他“基础结构”事物。所以,问题就消失了......
虽然以多语言方式执行此操作是一个有趣的想法,但这并不能回答有关如何在 F# 中执行此操作的问题。除此之外,当仅以多语言方式执行 p/invoke 部分时(我们有一个几乎独占的 F# 堆栈),C# 是错误的语言。最后,我最终使用了 C++/CLI,并为 P/Invoke 使用了真正的 C 头文件,并为其提供了一个 .net 友好的接口。这具有为 P/Invoke 签名提供编译器的额外好处。
你的 c 声明是什么样的?
【参考方案1】:
通过下面链接中关于 Blittable 和 Non-Blittable 类型的描述,您可以尝试 System.Double 代替 float,因为它们在托管和非托管代码之间传递时不需要转换,这意味着不再需要特殊处理由具有性能优势的互操作封送处理程序提供:https://msdn.microsoft.com/en-us/library/75dwhxf7%28v=vs.110%29.aspx
我进行了搜索,发现这个相关主题可能会对您有所帮助:
Threat like a single array: http://***.com/a/18607817/4597705
【讨论】:
以上是关于如何编组多维数组的主要内容,如果未能解决你的问题,请参考以下文章