如何将结构内部的数组封送至本机dll

时间:2018-09-24 12:47:24

标签: c++ f# interop

我正在尝试将本机C ++ dll包装在.Net核心dll中。

作为测试(为了简单起见),我有一个小的C ++ dll,该dll导出一个函数,该函数采用指向结构的指针并从该结构内的数组返回一个元素。

struct param {
    int i;
    double d;
    double array[3];
};

extern "C" _declspec(dllexport) double GetSecondValue(param* p);

double GetSecondValue(param* p)
{
    return p->array[1];
}

在F#中,我有一个匹配的(?)结构

module Structures

open System.Runtime.InteropServices
[<StructLayout(LayoutKind.Sequential)>]
type Par = 
    struct
        val mutable i : int
        val mutable d : float
        [<MarshalAs(UnmanagedType.ByValArray, SizeConst=3)>]
        val mutable da : float[]
    end

然后是一个简单的程序进行测试

open System
open System.Runtime.InteropServices
open Structures

[<DllImport("Dll1")>]
extern double GetSecondValue(Par & p);


[<EntryPoint>]
let main argv =
    let mutable p = new Par()
    p.d <- 1.0
    p.i <- 5
    p.da <- [|3.0;7.0;9.0|]
    let result = GetSecondValue(&p)
    Console.WriteLine(result)
    0 // return an integer exit code

单个double和integer值通过ok,但是数组看起来像指针弄乱了 enter image description here

我怀疑我的封送处理不正确。任何人都可以就应该如何做提供任何建议(甚至更好的例子)。

0 个答案:

没有答案