Я пытаюсь обернуть нативную C ++ dll в dll ядра .Net.
В качестве теста (и для простоты) у меня есть небольшая библиотека 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
Одиночные двойные и целочисленные значения проходят нормально, но массив выглядит так, как будто указатель испортился
Я подозреваю, что мой маршалинг неверен. Может ли кто-нибудь предложить какой-либо совет (или даже лучше хороший пример) о том, как это должно быть сделано.
Задача ещё не решена.
Других решений пока нет …