【发布时间】:2021-07-04 03:55:56
【问题描述】:
我正在探索 F# 中的低级编程,我知道风险和一般“不要这样做”,这不是我想要的。
我目前正在尝试让事情正常工作的基本方法。
现在我遇到的问题是我得到了一些简单的类型(下面的代码),我将一些数据放入内存并尝试将这些数据作为结构读取。但它不断涌现 System.Reflection.TargetInvocationException 说我正在尝试读取受保护的内存?
#nowarn "9"
open FSharp.NativeInterop
open System.Runtime.InteropServices
type msgtype = OK = 0 | ERR = 1
[<type: Struct; StructLayout(LayoutKind.Explicit)>]
type msg =
[<field: FieldOffsetAttribute(0); MarshalAs(UnmanagedType.I1)>]
val tp : byte
[<field: FieldOffsetAttribute(1); MarshalAs(UnmanagedType.I4)>]
val content : int
let memory =
Marshal.AllocHGlobal(1024)
let read n =
let adr = memory
let ptr = NativePtr.ofNativeInt<_> memory
NativePtr.read ptr
let write item adr =
let adr' = memory + adr
let ptr = NativePtr.ofNativeInt adr'
NativePtr.write ptr item
write 1uy memory
write 654 (memory+1n)
let m : msg = read memory
Marshal.FreeHGlobal memory
【问题讨论】: