6 Stimmen

Was ist der effizienteste Weg, um C++-Strukturen zu C# marshal?

Ich bin dabei, tonnenweise Binärdateien zu lesen, jede mit 1000 oder mehr Datensätzen. Es kommen ständig neue Dateien hinzu, also schreibe ich einen Windows-Dienst, der die Verzeichnisse überwacht und neue Dateien verarbeitet, sobald sie eingehen. Die Dateien wurden mit einem C++-Programm erstellt. Ich habe die Strukturdefinitionen in c# neu erstellt und kann die Daten gut lesen, aber ich bin besorgt, dass die Art und Weise, wie ich es tue, schließlich meine Anwendung beenden wird.

using (BinaryReader br = new BinaryReader(File.Open("myfile.bin", FileMode.Open)))
{
    long pos = 0L;
    long length = br.BaseStream.Length;

    CPP_STRUCT_DEF record;
    byte[] buffer = new byte[Marshal.SizeOf(typeof(CPP_STRUCT_DEF))];
    GCHandle pin;

    while (pos < length)
    {
        buffer = br.ReadBytes(buffer.Length);
        pin = GCHandle.Alloc(buffer, GCHandleType.Pinned);
        record = (CPP_STRUCT_DEF)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(CPP_STRUCT_DEF));
        pin.Free();

        pos += buffer.Length;

        /* Do stuff with my record */
    }
}

Ich glaube nicht, dass ich GCHandle verwenden muss, weil ich nicht tatsächlich mit der C++-Anwendung kommuniziere, alles wird von verwaltetem Code getan, aber ich weiß nicht, eine alternative Methode.

0voto

Boppity Bop Punkte 8498

Es scheint, dass dies weder mit C++ noch mit Marshalling zu tun hat. Sie kennen die Struktur, was brauchen Sie noch?

Offensichtlich benötigen Sie einen einfachen Code, der Gruppe von Bytes, die eine Struktur und dann mit BitConverter lesen wird, um Bytes in entsprechende C#-Felder zu platzieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X