You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行时确定带Structure约束的泛型类型的字节长度?

获取泛型结构类型的字节长度以用于MemoryMappedFile视图访问器

我明白你现在的需求:在运行时确定泛型约束为Structure的类型T的字节长度,这样就能计算出需要写入内存映射文件的总字节数,进而创建对应的视图访问器来操作数据。在VB.NET里,我们可以借助System.Runtime.InteropServices.Marshal类的方法来精准获取结构的字节大小,下面是具体的实现方案:

首先,你需要确保代码文件顶部导入必要的命名空间:

Imports System.Runtime.InteropServices
Imports System.IO.MemoryMappedFiles

接下来是完整的CTest(Of T As Structure)类实现,我把你未写完的Append方法补全,同时处理内存映射文件的写入逻辑:

Private goVirtualFile As MemoryMappedFile
Private glLength As Long = 0

Public Class CTest(Of T As Structure)
    Public Sub Append(tData As T())
        If tData Is Nothing OrElse tData.Length = 0 Then
            Return
        End If

        ' 获取单个结构的字节长度
        Dim iStructLen As Integer = Marshal.SizeOf(GetType(T))
        ' 计算需要写入的总字节数
        Dim totalBytes As Long = tData.Length * iStructLen

        ' 创建或获取内存映射文件的视图访问器,支持写入
        Using accessor As MemoryMappedViewAccessor = goVirtualFile.CreateViewAccessor(glLength, totalBytes)
            For Each dataItem As T In tData
                ' 将结构写入到内存映射文件的指定位置
                accessor.Write(glLength, dataItem)
                ' 更新当前已写入的长度
                glLength += iStructLen
            Next
        End Using
    End Sub

    ' 建议补充构造函数,初始化MemoryMappedFile
    Public Sub New(mappedFile As MemoryMappedFile)
        goVirtualFile = mappedFile
    End Sub
End Class

关键细节说明:

  • Marshal.SizeOf(GetType(T)):这个方法会返回指定值类型(这里是结构T)在非托管内存中的字节大小,对于符合Structure约束的类型来说,它能精准反映结构实际占用的内存字节数,完全满足你的需求。
  • 视图访问器的创建:CreateViewAccessor方法的第一个参数是起始偏移量(也就是我们维护的glLength,记录已写入的总长度),第二个参数是本次要写入的字节数,这样就能在内存映射文件的末尾追加数据。
  • 结构写入:MemoryMappedViewAccessor.Write方法直接支持写入值类型,所以可以把结构dataItem直接写入到指定偏移位置,非常方便。

需要注意的是,如果你的结构T使用了StructLayout属性自定义了内存布局(比如指定了Pack大小),Marshal.SizeOf也会根据这个布局计算出正确的字节长度,不用担心兼容性问题。

内容的提问来源于stack exchange,提问作者user1889116

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:40:49