У нас много унаследованного кода, написанного на C / C ++, который поддерживает данные в структурах разделяемой памяти.В реализациях C / C ++ для многих функций мы получаем указатель на адрес разделяемой памяти, а затем приводим этот указатель к типу структуры, содержащейся в этой разделяемой памяти.
Мне нужно«порт» тот же интерфейс к C #.Требования заключаются в том, что мы не можем изменить какую-либо реализацию C / C ++, а интерфейсы используются для доступа к данным практически в реальном времени (поэтому проблема производительности).Многие структуры данных содержат вложенные структуры других пользовательских структур.Основной способ доступа к данным - получить точку к структуре, а затем напрямую получить доступ к нужным элементам.
Моя проблема заключается в том, как создать эквивалентные структуры данных в C #, которые полностью неуправляемы и могут использоваться в C # с помощьюуказатели.В C # вложенные структуры могут быть созданы с использованием атрибута fixed, но этот атрибут поддерживает только примитивные типы данных, вы не можете использовать ключевое слово fixed с пользовательскими типами.В большинстве примеров в Интернете маршалинг используется для доступа к элементам данных, но стиль объявления в этих примерах приводит к тому, что структура данных управляется, поэтому ее нельзя использовать в качестве указателей.
Ниже приведен простой примерреализация C / C ++, которая должна быть портирована на C #.
Есть ли у кого-нибудь метод для преобразования этого в реализацию C #, которая создает чисто неуправляемую структуру данных, доступ к которой может быть небезопасным с помощью указателей?
// Structures.cpp : Defines the entry point for the console application.
//
'#include "StdAfx.h"
typedef struct inner_struct
{
int a;
float b;
char text[16];
} InnerStruct;
'#define NUMELEMENTS 20
typedef struct outer_struct
{
int flag;
int num;
InnerStruct data[NUMELEMENTS];
} OuterStruct;
void *fSharedMemory();
int _tmain(int argc, _TCHAR* argv[])
{
int a;
OuterStruct *data = NULL;
data = (OuterStruct *)fSharedMemory();
while (true)
{
if (data->flag)
for (int i=0; i<data->num; i++) {
a = data->data[i].a;
}
Sleep(100);
}
return 0;
}
Я чувствую, что здесь чего-то не хватает.Если бы у нас было достаточно времени и денег, мы бы переписали всю реализацию как управляемый код, но я должен верить, что я не единственный, кто должен взаимодействовать с унаследованным кодом.