相关疑难解决方法(0)

如何固定一个字节数组?

我想固定一个10兆字节的字节数组,以便托管和非托管代码可以使用它.

我的方案是我有一个非托管驱动程序,它从设备读取一些数据并将其写入大数组,托管应用程序只读取该数据.

像这样的东西:

byte[] dataArray = new byte[10*1024*1024];
Run Code Online (Sandbox Code Playgroud)

我想固定dataArray,以便GC不移动它.

实际上,当我运行应用程序时,我得到一个DataAbortApplication,并在互联网上阅读后发现我应该固定dataArray以避免此错误.

我该怎么做?

.net c# arrays

16
推荐指数
1
解决办法
4505
查看次数

将C++结构编组到C#的最有效方法是什么?

我即将开始阅读大量的二进制文件,每个文件有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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

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

c# performance pinvoke marshalling

6
推荐指数
2
解决办法
5390
查看次数

标签 统计

c# ×2

.net ×1

arrays ×1

marshalling ×1

performance ×1

pinvoke ×1