我们有一些涉及矩阵的互操作代码。我试图调用本机DLL,并且大多数情况下它非常可靠。
我依赖于default marshalling by .net,避免使用非托管指针,而是大部分使用.net数组,可能还有byref
。 .net文章说,多维数组被隐式编组为列主要的一维数组,这很好。
唯一似乎不起作用的是尝试编组多维数组,因为F#编译器抱怨float[,]
声明中不允许extern
。这种限制有什么办法吗?
我知道F#PowerPack中的PinnedArray
和PinnedArray2
类型,但我一直在寻找依赖托管指针的解决方案 - 更重要的是 - 我希望避免包括F#PowerPack作为PinnedArray
类的依赖项。
答案 0 :(得分:1)
通过下面链接中关于Blittable和Non-Blittable类型的描述你可以尝试使用System.Double代替float,因为它们在托管和非托管代码之间传递时不需要转换,这意味着没有更多的特殊处理由interop marshaler加上表现:https://msdn.microsoft.com/en-us/library/75dwhxf7%28v=vs.110%29.aspx
我进行了搜索,发现了这个可能对您有帮助的相关主题:
Threat like a single array: http://stackoverflow.com/a/18607817/4597705