C++/C#互操作 我已经开发了一些DLL,以便于从C++的DLL调用一些东西到C语言。然而,我在一个硬实时环境中工作,P/Invoke被证明太慢,无法执行某些操作 P>所以我遇到了内存映射(Pr/PoCKE)(一种假定的)更快的替代,在测试期间,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; }

C++/C#互操作 我已经开发了一些DLL,以便于从C++的DLL调用一些东西到C语言。然而,我在一个硬实时环境中工作,P/Invoke被证明太慢,无法执行某些操作 P>所以我遇到了内存映射(Pr/PoCKE)(一种假定的)更快的替代,在测试期间,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; },c#,c++,interop,pinvoke,memory-mapping,C#,C++,Interop,Pinvoke,Memory Mapping,我从这里改编了代码: 这是C面: 它按预期工作,但这里有一个问题:ReadArray方法中字节数组长度的固定大小。我想我必须将实际应用程序中实际字符串的长度写入另一个共享,然后使用它读取字符串值,但这似乎太麻烦了。考虑到我在实际应用中从C++中读取的是结构数组(主要包含字符串),从内存映射中得到了什么好处,性能是否明智?我不打算用一种可能不会产生预期结果的替代方法来膨胀稳定的代码(尽管速度很慢),那么这种方法有什么真正的好处吗?有更好的选择吗?内存映射文件有利于跨进程共享数据。它们对于在同一内

我从这里改编了代码:

这是C面:


它按预期工作,但这里有一个问题:ReadArray方法中字节数组长度的固定大小。我想我必须将实际应用程序中实际字符串的长度写入另一个共享,然后使用它读取字符串值,但这似乎太麻烦了。考虑到我在实际应用中从C++中读取的是结构数组(主要包含字符串),从内存映射中得到了什么好处,性能是否明智?我不打算用一种可能不会产生预期结果的替代方法来膨胀稳定的代码(尽管速度很慢),那么这种方法有什么真正的好处吗?有更好的选择吗?

内存映射文件有利于跨进程共享数据。它们对于在同一内存空间中的模块之间共享毫无意义

只需以普通方式将数据结构定义为引用类类型,然后将其固定。现在C++可以直接使用普通指针访问数据结构。
计数字符串在固定数组中的效果与在内存映射文件中的效果一样,只是不需要任何内核调用来设置它们。

C#不适合硬实时环境。垃圾收集器将错过您的计时。事实上,Windows不适合硬实时环境,因为分页和中断处理将错过计时。软实时/近实时是另一回事。当然,我们不打算有1:1的比例。C#部分仅用于可视化,并且值会不断快速更新,如果我们错过了更高级别的一些更新,这并不重要。然而,使用软实时仿真器运行一切都很好,但是一旦我们连接到真正的硬件,事情就会变得非常糟糕。我喜欢你关于固定对象的建议。我将在星期一试用并报告结果。现在是星期一吗?@GregM从星期一开始有几个不喜欢的地方:)
    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();
    }