使用C#读取(使用Filesystem.FileGet)VB6记录文件(使用Put编写)

cca*_*oni 7 .net c# vb6

我需要从Visual Basic 6生成的遗留数据库文件中读取数据.从遗留软件中我发现该文件是使用Put并将记录类型作为参数传递给Put函数.这些结构定义如下:

Type THE_TYPE
    FIELD_1 As Single
    FIELD_2 As String * 20
    FIELD_3(1 To 50) As Single
    FIELD_4(1 To 10) As String * 1
End Type
Run Code Online (Sandbox Code Playgroud)

我的类型更大,更复杂,但我在THE_TYPE中添加了我在项目中的不同定义.我发现导入Microsoft.VisualBasic让我可以访问类似于用于编写文件的VB函数,所以我用FileSystem.OpenFile()和.CloseFile()打开和关闭文件.现在我需要最终读取包含的数据,因为原始函数是:

Public RecordContent As THE_TYPE
[...] 
Get #1, recordNumber, RecordContent 
Run Code Online (Sandbox Code Playgroud)

我想我可以使用类似的东西,比如Microsoft.VisualBasic.FileSystem.FileGet().所以问题是,我如何定义一个容器,我想一个类,类似于原来的VB6类型"THE_TYPE"?如何调用.FileGet()来正确填充此对象?

GSe*_*erg 7

关键是在VB.NET中的结构声明中正确定义属性.如果结构总是被初始化FileGet,则不需要在构造函数中手动初始化其固定字段,否则就可以.

Structure THE_TYPE
    Public FIELD_1 As Single
    <VBFixedString(20), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20)> Public FIELD_2 As String
    <VBFixedArray(49)> Public FIELD_3 As Single()
    <VBFixedArray(9)> Public FIELD_4 As Char()
End Structure
Run Code Online (Sandbox Code Playgroud)

很明显,数组必须从零开始,因此上限向下移动.

从文件中读取:

Dim d As System.ValueType = New THE_TYPE()

FileOpen(1, "...", OpenMode.Random, OpenAccess.Read, OpenShare.Default, 234)
FileGet(1, d, 1)
FileClose(1)
Run Code Online (Sandbox Code Playgroud)

234是VB6中结构的大小.它在VB.NET中更大,所以你想要硬编码.

  • @Decoder94 `​​VBFixedArray` 最多支持二维。尝试将数组声明为动态大小,以便“Put”写入[数组描述符](https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/put-statement #remarks) 也可以通过 `Get` 读取。 (2认同)
  • @Decoder94 尝试 `VBFixedArray(40)&gt; Dim Channels() As Char`。 (2认同)
  • @Decoder94 数组中有 40 个元素 (2 * 10 * 2),每个元素 1 个字符。那是 40 个字符。 (2认同)