我正在尝试将本机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,但是数组看起来像指针弄乱了
我怀疑我的封送处理不正确。任何人都可以就应该如何做提供任何建议(甚至更好的例子)。