用VB.NET FilePut编写的C#读取二进制文件

问题描述 投票:0回答:2

我有一个 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

但似乎我并不总是从我的文件中获得正确数量的记录。此外,字符串值中的一些变音符号未正确编码(在德国的 Windows 上运行)。

有人有一个好的、安全的方法可以做吗,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.net file binary
2个回答
0
投票

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。


-1
投票

现在解决了这个问题,在我的解决方案中创建一个 VB 项目,将 VB.Structures 放入其中,以及使用 VB 读取它的方法并使用我的 c# 项目中的该模块。就像魅力一样。

© www.soinside.com 2019 - 2024. All rights reserved.