【问题标题】:F# reading and writing to and from unmanaged dataF# 读写非托管数据
【发布时间】: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

【问题讨论】:

    标签: f# unmanaged


    【解决方案1】:

    我自己解决了这个问题。

    显然 write 函数是问题所在。

    我改成

    let write add item = 
        NativePtr.write (NativePtr.ofNativeInt<_> add) item
    

    而且效果很好。

    可以说,如果只是声明问题只是在某种程度上它是不同的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      相关资源
      最近更新 更多