2010-11-23 3 views
0

Wir haben eine Menge Legacy-Code in C/C++ geschrieben, der Daten in Shared-Memory-Strukturen verwaltet. In den C/C++ - Implementierungen erhalten wir für viele Funktionen einen Zeiger auf die Adresse des gemeinsam genutzten Speichers und dann den Zeiger auf den Strukturtyp, der in diesem gemeinsamen Speicher enthalten ist.Erstellen einer nicht verwalteten verschachtelten Struktur fester Länge in C#, auf die mit Zeigern zugegriffen werden kann

Ich muss die gleiche Schnittstelle zu C# "portieren". Die Anforderungen sind, dass wir keine der C/C++ - Implementierung ändern können und die Schnittstellen werden verwendet, um nahezu in Echtzeit auf die Daten zuzugreifen (daher ist die Leistung ein Problem). Viele der Datenstrukturen enthalten verschachtelte Strukturen anderer benutzerdefinierter Strukturen. Der primäre Weg, auf die Daten zuzugreifen, besteht darin, einen Punkt auf die Struktur zu bekommen und dann direkt auf die gewünschten Elemente zuzugreifen.

Mein Problem ist, wie äquivalente Datenstrukturen in C# erstellt werden, die vollständig nicht verwaltet werden und in C# durch Zeiger verwendet werden können. In C# können verschachtelte Strukturen mit dem Attribut "fixed" erstellt werden, aber dieses Attribut unterstützt nur primitive Datentypen. Sie können das Schlüsselwort "fixed" nicht mit benutzerdefinierten Typen verwenden. Die meisten Beispiele im Web verwenden Marshalling, um auf die Datenelemente zuzugreifen, aber der Deklarationsstil in diesen Beispielen bewirkt, dass die Datenstruktur verwaltet wird, sodass sie nicht als Zeiger verwendet werden kann.

Der folgende Code ist ein einfaches Beispiel für die C/C++ - Implementierung, die nach C# portiert werden muss.

Hat jemand eine Methode, um dies in eine C# -Implementierung zu konvertieren, die eine rein nicht verwaltete Datenstruktur erzeugt, auf die mit Zeigern als unsicher zugegriffen werden kann?

// 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; 
} 

Ich fühle mich wie etwas hier fehlt. Bei genügend Zeit und Geld würden wir die gesamte Implementierung als verwalteten Code umschreiben, aber ich muss glauben, dass ich nicht der Einzige bin, der mit altem Code interagieren muss.

Antwort

0

Sie können PInvoke/Rangierung verwenden zu tun, was Sie

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

Es gibt Beispiele auf dieser Website benötigen, wird es lassen Sie in DLL und C/C++ Strukturen in C# zu integrieren.

+0

Leider zeigen alle Beispiele, die ich im Web gefunden habe (diese enthalten), nicht, wie verschachtelte benutzerdefinierte Strukturen so behandelt werden, dass das Ergebnis ein nicht verwalteter Typ ist, der mit Zeigern in C# verwendet werden kann. . – user517041

+0

Was von dem nicht verwalteten Code zurückgegeben wird, der in C als Äquivalent zu void * aufgerufen wird, und der zurückgegebene void * -Zeiger muss als Punkt in eine verschachtelte benutzerdefinierte Struktur umgewandelt und dann mit dem von zurückgegebenen Zeiger aufgerufen werden der nicht verwaltete Code – user517041

Verwandte Themen