我需要从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()来正确填充此对象?
关键是在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中更大,所以你想要硬编码.