Wrapping native C++ struct in C++/CLI

Habe ich noch nie gearbeitet, die entweder mit C++ oder C++/CLI, aber ich möchte eine native C++ - Bibliothek in ein C# - Projekt. Ich habe ein wenig gegoogelt, gelernt, ein paar Dinge über C++/CLI und beschlossen, give it a head start. Aber ich bin mir nicht sicher, ob ich das Tue es rechts.

Habe ich Folgendes struct in einem einheitlichen namespace:

avcodec.h

typedef struct AVCodecDescriptor {
    enum AVCodecID     id;
    enum AVMediaType type;

    const char      *name;
    const char *long_name;
    int             props;
} AVCodecDescriptor;

Nun möchte ich zum Abschluss noch struct in C++/CLI für die Verwendung in C#:

public ref struct AVCodecDescriptorWrapper {

    private:
        struct AVCodecDescriptor *_avCodecDescriptor;

    public:
        AVCodecDescriptorWrapper() {
            _avCodecDescriptor = new AVCodecDescriptor();
        }
        ~AVCodecDescriptorWrapper() {
            delete _avCodecDescriptor;
        }

        //what do?
        property AVCodecID Id {
            AVCodecID get() {
                return; //what comes here ????
            }
        }

};

Jedoch, wie es scheint, bin ich etwas schrecklich falsch, denn ich bin nicht einmal in der Lage, um zu sehen, die Felder der struct AVCodecDescriptor in C++/CLI. Muss ich wickeln Sie die enums in den struct zu? Muss ich kopieren Sie Sie in C++/CLI und warf es (gut, enum AVCodecID hat wie 350 Werte - ein copy/paste scheint ridiculus.)

  • Mit new und delete ist eher sinnlos hier. private: AVCodecDescriptor _avCodecDescriptor; genügt. Und ja, Sie haben zu wickeln alles. Einschließlich der Enumerationen. Sie müssen deklariert werden als verwaltete Typen. Und dann ordnen Sie Sie aus dem nicht verwalteten auf verwaltete. Als für die Art, wie Sie wickeln, sollten Sie wirklich es so? Wie sind Sie gehen zu verwalten, die Lebensdauer der const char* Mitglieder. Ehrlich gesagt, es ist mir nicht klar, dass C++/CLI ist es einfacher werden wird als p/invoke.
  • 1) privat: AVCodecDescriptor _avCodecDescriptor nicht funktionieren, da die VS sagt mir, dass ich nicht verwenden können, eine nicht verwaltete Mitglied in einer verwalteten Klasse. 2) Danke für die Klärung! 3) Wie muss ich sonst wickeln? Es ist die Art und Weise eine Menge tutorials handling. 4) ich bin nicht vertraut mit P/Invoke entweder. Aber ich muss irgendwo anfangen. Ich hörte eine Menge Leute sagen, P/Invoke kann wesentlich langsamer sein und da die Bibliothek mit dem ich arbeite ist ffmpeg.. naja, Sie wissen schon.
  • return (ManagedAVCodecID)_avCodecDescriptor->id; Sie brauchen einen finalizer als gut. Ziemlich sicher, dass ffmpeg bereits verpackt vor. Viele tote Projekte, obwohl, bekommen es eigentlich fertig zu sein scheint eine hohe Hürde.
  • Nicht nur viele tote Projekte, sondern auch Billionen von sogenannten 'Wrapper', die nicht wirklich wickeln Sie die ffmpeg-Bibliotheken, aber nur konstruieren, Befehl Linie Argumente und übergeben Sie an ffmpeg. :/
InformationsquelleAutor Acrotygma | 2014-01-30
Schreibe einen Kommentar