Как маршалировать массивы внутри структуры в нативную DLL - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь обернуть нативную C ++ dll в dll ядра .Net.

В качестве теста (и для простоты) у меня есть небольшая dll C ++, которая экспортирует одну функцию, которая принимает указательв структуру и возвращает один элемент из массива в структуре.

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

Одиночные двойные и целочисленные значения проходят нормально, но массив выглядит так, как будто указатель испортился enter image description here

Я подозреваю, что мой маршалинг неправильный.Может кто-нибудь предложить какой-либо совет (или даже лучше хороший пример) о том, как это должно быть сделано.

...