c# - 将 C++ 结构编码(marshal)到 C# 的最有效方法是什么?

标签 c# performance pinvoke marshalling

我即将开始阅读大量二进制文件,每个文件都有 1000 条或更多记录。不断添加新文件,因此我正在编写一个 Windows 服务来监视目录并在收到新文件时对其进行处理。这些文件是用 C++ 程序创建的。我已经在 C# 中重新创建了结构定义并且可以很好地读取数据,但我担心我这样做的方式最终会杀死我的应用程序。

using (BinaryReader br = new BinaryReader(File.Open("myfile.bin", FileMode.Open)))
{
    long pos = 0L;
    long length = br.BaseStream.Length;

    CPP_STRUCT_DEF record;
    byte[] buffer = new byte[Marshal.SizeOf(typeof(CPP_STRUCT_DEF))];
    GCHandle pin;

    while (pos < length)
    {
        buffer = br.ReadBytes(buffer.Length);
        pin = GCHandle.Alloc(buffer, GCHandleType.Pinned);
        record = (CPP_STRUCT_DEF)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(CPP_STRUCT_DEF));
        pin.Free();

        pos += buffer.Length;

        /* Do stuff with my record */
    }
}

我认为我不需要使用 GCHandle,因为我实际上并没有与 C++ 应用程序通信,一切都是通过托管代码完成的,但我不知道有替代方法。

最佳答案

使用 Marshal.PtrToStructure 相当慢。我在 CodeProject 上发现了以下文章,该文章比较(和基准测试)读取二进制数据的不同方式非常有帮助:

Fast Binary File Reading with C#

关于c# - 将 C++ 结构编码(marshal)到 C# 的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/878073/

相关文章:

C# 从 C++ DLL 编码(marshal) Unsigned Char 返回值

c# - C# 中的随机数问题

python - if else 与数学映射小序列

.net - C#如何在不编码对象的情况下将对象固定在内存中?

c# - 将带有字符串数组的 C# 结构传递给 c++ 函数,该函数接受 void * 用于 c# 结构和 char** 用于 c# 字符串数组

c# - SignalR 中的简单注入(inject)器注册问题

c# - 为什么此动态列表比较失败?

javascript - Fabric.js 中的灰度很慢

c++ - 为什么更改 for 循环迭代顺序会增加运行时间?

c# - 在编译时不知道 DLL 时调用 PInvoke?