Я разработал несколько dlls некоторое время назад, чтобы P/вызывать некоторые вещи из C++ dll в C#. Тем не менее, я работаю в условиях жесткого реального времени, и P/Invoke оказалось слишком медленным для выполнения определенных операций.Отображение памяти и P/Вызов производительности в C++/C# interop
Так я наткнулся карт памяти как (предположительно) более быстрой альтернативой 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();
}
Он работает по назначению, но здесь есть проблема: этот фиксированный размер для длины байтового массива в методе ReadArray. Полагаю, мне пришлось бы записать длину фактических строк в моем реальном приложении на другой ресурс, а затем использовать его для чтения строкового значения, но это кажется слишком громоздким. Учитывая, что то, что я действительно читал из C++ в реальном приложении, - это массивы структур (которые содержат только строки, в основном), мог бы я получить какой-либо выигрыш от сопоставления памяти, по производительности? У меня нет намерений раздувать стабильный код (хотя и медленный) с альтернативой, которая может не иметь намеченных результатов, так ли какие-либо реальные преимущества для этого подхода? Есть ли лучшая альтернатива?
C# не подходит для жесткой среды реального времени. Сборщик мусора пропустит ваши тайминги. Фактически, Windows не подходит для жесткой среды реального времени, поскольку пейджинг и обработка прерываний пропустят ваши тайминги. Мягкое реальное время/около реального времени - это совсем другая история. –
Конечно, мы не намерены иметь соотношение 1: 1. Часть C# предназначена только для визуализации, и значения обновляются постоянно и быстро таким образом, что это не имеет значения, если мы пропустим несколько обновлений на более высоком уровне. Тем не менее, запуск всего, используя мягкий эмулятор реального времени, работает отлично, но как только мы подключаемся к реальному оборудованию, все становится очень неудачным. – makoshichi