Как создать неуправляемую вложенную структуру фиксированной длины в C #, к которой можно получить доступ с помощью указателей - PullRequest
1 голос
/ 23 ноября 2010

У нас много унаследованного кода, написанного на 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;
}

Я чувствую, что здесь чего-то не хватает.Если бы у нас было достаточно времени и денег, мы бы переписали всю реализацию как управляемый код, но я должен верить, что я не единственный, кто должен взаимодействовать с унаследованным кодом.

1 Ответ

1 голос
/ 23 ноября 2010

Вы можете использовать PInvoke / Marshalling, чтобы сделать то, что вам нужно

http://msdn.microsoft.com/en-us/library/aa288468%28VS.71%29.aspx

На этом сайте есть примеры, которые позволят вам интегрироваться в структуры DLL и C / C ++ в C #.

...