我有一个 VB 结构,例如像这样:
Structure MyTestStruct
<VBFixedString(20)> Public stringfield As String
<VBFixedString(40)> Public stringfield2 As String
Public intfield As Integer
Public doublefield As Double
Public boolfield As Boolean
End Structure
我用 VB 的
FilePut
将其中的许多内容写入文件。
我如何将其读入 C# 类(或结构)?
我尝试使用 C# 类,例如:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class MyTestStruct
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string stringfield;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]
public string stringfield2;
public int intfield;
public double doublefield;
public bool boolfield;
}
并与
FileStream.Read
或同时与 BinaryReader
。有人有一个好的、安全的方法可以做吗,VB.NET 在 C# 中用
FileGet
做什么?
我还注意到,C# 中有
Microsoft.VisualBasic.FileSystem.FileGet
。但它不接受我的变量来写入结果。
MyTestStruct data = new MyTestStruct();
Microsoft.VisualBasic.FileSystem.FileGet(1, ref data);
我的期望是,在 C# 中有一个方法,给它一个文件名和要读取的类型,并将其内容读取为给定类型的值。就像 VB.NET 对
FileGet
所做的那样。
在 VB 中它看起来像:
Dim data As MyTestStruct
recLength = Len(data)
FileOpen(1, "data.dat", OpenMode.Random, , , recLength)
FilePut(1, data)
FileClose(1)
Dim datar As MyTestStruct
FileOpen(1, "data.dat", OpenMode.Random, , , recLength)
Do WHILE Not EOF(1)
FileGet(1, datar)
Loop
FileClose(1)
将
C#
“类”构建为实际结构,并使用实际的 VB 属性,如下所示:
public struct MyTestStruct
{
[Microsoft.VisualBasic.VBFixedStringAttribute(20)]
public string stringfield;
[Microsoft.VisualBasic.VBFixedStringAttribute(40)]
public string stringfield2;
public int intfield;
public double doublefield;
public bool boolfield;
}
然后您可以使用 C# 中的 VB
FileOpen()
和 FileGet()
方法
MyTestStruct data = new MyTestStruct();
Microsoft.VisualBasic.FileSystem.FileOpen(1, "data.dat", OpenMode.Random, , , recLength)
Microsoft.VisualBasic.FileSystem.FileGet(1, ref data);
请注意,C# 不会只让您保留这些空参数。您需要检查文档中的默认值并实际填写这些位置。
但是你不应该这样做。
旧的 VB 文件 I/O 方法已弃用,不应用于新开发。它们的存在只是为了从非常旧的 VB 系统中移植代码,为您争取时间将应用程序转移到
System.IO
中较新的文件访问 API。
现在解决了这个问题,在我的解决方案中创建一个 VB 项目,将 VB.Structures 放入其中,以及使用 VB 读取它的方法并使用我的 c# 项目中的该模块。就像魅力一样。