SharedMemory.BufferReadWrite 破坏(切割)数据

     2023-02-16     17

关键词:

【中文标题】SharedMemory.BufferReadWrite 破坏(切割)数据【英文标题】:SharedMemory.BufferReadWrite corrupting (cutting) data 【发布时间】:2021-01-15 09:39:15 【问题描述】:

我正在尝试使用 SharedMemory 包在两个用 C# .Net 3.5 编写的 C# 应用程序之间共享数据(遗憾的是无法升级)。我写了一个简单的测试来看看它是如何工作的

    private void runTest()
    
        string testText = "someTest";   //"some", "someTest12"
        CreateOrOpenMappedFile(testText);
        string result = ReadMemoryMappedFile();
    
    
    protected void CreateOrOpenMappedFile(string data)
    
        char[] dataBuffer = data.ToCharArray();
        SharedMemory.BufferReadWrite buff = new SharedMemory.BufferReadWrite("sharedMemoryName", 4096);
        buff.Write(dataBuffer);
    

    protected string ReadMemoryMappedFile()
    
        char[] data = new char[10];         
        SharedMemory.BufferReadWrite buff = new SharedMemory.BufferReadWrite("sharedMemoryName");
        buff.Read(data);
        buff.Close();
        return new string(data);
    

在 runTest 方法中,我希望 testText 字符串与结果相同,但我得到的是一个被剪裁的字符串。对于 testText == "someTest" 结果是 "some",对于 "some",结果是 "so",对于 "someTest12" 结果是 "someT"。 这里会发生什么? 马立克

【问题讨论】:

BufferReadWrite()的实现是什么? 不知道这个包,但从类似的情况来看,这可能与不完整的写入有关。检查 BufferReadWrite 是否使用 IDiposable,如果是,则将其包装在 using 语句中。您还可以使用 P/Invoke 来使用操作系统功能(多年来一直使用这种方法) 鉴于pointData 的第一次出现是在您对Read 的调用中,此代码不应编译。请确保您的示例编译并展示了您要询问的问题 除了TomB所说的,如果处理MMF将其关闭并使其无法打开以供随后读取,请寻找Flush()方法。 Damien - 抱歉,拼错了。显然两者应该是一样的,我在问题中改变了它。 TomB - 在 using 中包装 BufferReadWrite 会在写入后关闭内存文件,因此尝试读取它会引发异常。 【参考方案1】:

通过将字符串转换为 byte[] 而不是 char[] 来解决问题。 其作者在github repository of this library 中提供了答案。

【讨论】: