C /C#Interop中的内存映射和P/调用性能

Memory mapping and P/Invoke performance in C++/C# interop

本文关键字:性能 映射 调用 内存 C#Interop      更新时间:2023-10-16

我回到了几个dll,以便在c dll到c#调用一些东西。但是,我在艰难的时间环境中工作,事实证明,请注意太慢而无法执行某些操作。

因此,我遇到了记忆映射,作为一个(据称)更快的p/invoke替代替代速度,在我的测试中,事物的C 方面看起来并没有太破旧:

#include "stdafx.h"
#define BUF_SIZE 256
TCHAR szName[] = TEXT("MyFileMappingObject");
char* pcTest = "Message from C++";
int _tmain()
{
    HANDLE hMapFile;
    LPCTSTR pBuf;
    hMapFile = CreateFileMapping(
                INVALID_HANDLE_VALUE,
                NULL,
                PAGE_READWRITE,
                0,
                BUF_SIZE,
                szName);
    if (hMapFile == NULL) {
        _tprintf(TEXT("Could not create file mapping object (%d).n"), GetLastError());
        return 1;
    }
    pBuf = (LPTSTR)MapViewOfFile(
                hMapFile,
                FILE_MAP_ALL_ACCESS,
                0,
                0,
                BUF_SIZE);
    if (pBuf == NULL) {
        _tprintf(TEXT("Could not map view of file (%d).n"), GetLastError());
        CloseHandle(hMapFile);
        return 1;
    }
    CopyMemory((PVOID)pBuf, pcTest, (strlen(pcTest) * sizeof(char*)));
    std::cin.get(); 
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
    return 0;
}

我从这里调整了代码:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v = vs.85).aspx

这是C#侧:

    static void Main(string[] args)
    {
        MemoryMappedFile pagedMemoryMap = MemoryMappedFile.OpenExisting("MyFileMappingObject", MemoryMappedFileRights.FullControl);
        using (MemoryMappedViewAccessor fileMap = pagedMemoryMap.CreateViewAccessor())
        {
            var array = new byte[256];
            fileMap.ReadArray(0, array, 0, 16); //Take notice on this line
            var text = Encoding.ASCII.GetString(array);
            Console.WriteLine(text);
        }
        Console.ReadKey();
    }

它可以按预期工作,但是这里有一个问题:该字节阵列长度的固定尺寸在RealAray方法中。我想我必须将实际应用程序中实际字符串的长度写入不同的共享,然后用它来读取字符串值,但这似乎太麻烦了。考虑到我在实际应用程序中实际上从C 中读到的是结构的数组(仅包含字符串,主要是字符串),我是否会从内存映射中获得任何收益?我没有任何可能没有预期结果的替代方案的腹胀稳定代码(尽管很慢)的意图,那么这种方法是否有任何真正的好处?有更好的选择吗?

内存映射的文件非常适合在过程中共享数据。它们毫无意义,无法在同一内存空间中的模块之间共享。

只是以普通方式将数据结构定义为参考类类型,然后将其固定。现在C 可以使用普通指针访问直接访问数据结构。

计数的字符串在固定数组中的固定量与内存映射文件一样工作,除了您不需要任何内核调用即可设置它们。