Я пытаюсь переписать пример сортировки SysTime из статьи Классы маршалинга, структуры и объединения Статья MSDN с C # на F #.
Мой настоящий код теперь выглядит так:
module LibWrap =
open System.Runtime.InteropServices
[<StructLayout(LayoutKind.Sequential)>]
type public SystemTime =
struct
val mutable public year:uint16
val mutable public month:uint16
val mutable public weekday:uint16
val mutable public day:uint16
val mutable public hour:uint16
val mutable public minute:uint16
val mutable public second:uint16
val mutable public millisecond:uint16
end
[<DllImport("Kernel32.dll")>]
extern void GetSystemTime([<param:In>][<param: Out>]SystemTime st)
[<EntryPoint>]
let main argv =
printfn "F# SysTime Sample using Platform Invoke";
let st = new LibWrap.SystemTime (month = 1us, day = 2us, year = 34us)
try
LibWrap.GetSystemTime st
with
| ex -> printfn "Failed to GetSystemTime: %O" ex
printfn "The Date is: %d/%d/%d" st.month st.day st.year
0
Он компилируется и запускается без исключения, но вывод не такой, как ожидалось. Значения в структуре SystemTime не перезаписываются.
Выход:
F# SysTime Sample using Platform Invoke
The Date is: 1/2/34
Если я запускаю код в интерактивной консоли F #, я получаю System.AccessViolationException
. Версия кода на C # отлично работает в моей системе. Я пытался использовать ref
/ byref
ключевые слова, но это не помогло.
Есть идеи, что не так?
Есть хороший источник информации, как правильно использовать P / Invoke и маршаллинг из F #? Я не нашел много полезных вещей.