2012-04-19 7 views
25

Titel erklärt. Ich habe native C++ - DLLs, für die ich C++/CLI-Wrapper schreibe, die wiederum in C# als Referenz importiert werden.C++/CLI-Wrapper für natives C++ zur Verwendung als Referenz in C#

Das Problem ist, dass in C# ich die Klassen nicht in Wrapper (aus DLL importiert) sehen.

Welche Schlüsselwörter sollte ich verwenden und WIE, um meine nativen C++ - Objekte neu zu deklarieren, um in C# sichtbar zu werden?

+0

Sind die Wrapper-Klassen öffentlich? Deklaration sollte "public ref class {...} sein;" – Asik

+0

Ich weiß das. Was ich frage ist, dass so etwas möglich ist: 'public ref class wrapper_class = native_class;'? Sind solche Ansätze möglich? – Haix64

+0

Es ist nicht so einfach. Die Wrapper-Klasse würde ein native_class-Objekt hosten und Wrapper-Methoden für alle Methoden von native_class erstellen, die Sie bereitstellen möchten. Die Wrapper-Methoden ordnen die Parameter nur an und delegieren den Aufruf an das native_class-Objekt. – Asik

Antwort

56

Ok, Tutorial. Sie haben eine C++ - Klasse NativeClass, die Sie für C# bereitstellen möchten.

class NativeClass { 
public: 
    void Method(); 
}; 

1) Erstellen Sie ein C++/CLI-Projekt. Verknüpfen Sie mit Ihrer C++ - Bibliothek und Kopfzeilen.

2) Erstellen Sie eine Wrapper-Klasse, die die gewünschten Methoden verfügbar macht. Beispiel:

#include "NativeClass.h" 

public ref class NativeClassWrapper { 
    NativeClass* m_nativeClass; 

public: 
    NativeClassWrapper() { m_nativeClass = new NativeClass(); } 
    ~NativeClassWrapper() { this->!NativeClassWrapper(); } 
    !NativeClassWrapper() { delete m_nativeClass; } 
    void Method() { 
     m_nativeClass->Method(); 
    } 
}; 

3) Fügen Sie einen Verweis auf Ihr C++/CLI-Projekt in C# Projekt.

4) Mit dem Wrapper innerhalb einer Anweisung using:

using (var nativeObject = new NativeClassWrapper()) { 
    nativeObject.Method(); 
} 

die Anweisung using stellt sicher entsorgen() aufgerufen wird, die unmittelbar auf den destructor läuft und zerstört das native Objekt. Sie werden sonst Speicherlecks haben und wahrscheinlich schrecklich sterben (nicht Sie, das Programm). Hinweis: The Dispose() method is magically created for you.

+0

Ich bin herausgefordert von dll nicht gefunden Fehler, aber trotzdem funktioniert Ihre Methode. Vielen Dank! – Haix64

+0

Ich folgte dieser Anweisung, aber erhalte diesen Fehler "type in einer using-Anweisung verwendet muss implizit in 'System.IDisposable' konvertiert werden" – javapowered

+1

Um Speicherverluste von 4) zu vermeiden, sollten Sie zusätzlich Finalizer implementieren! NativeClassWrapper(); Das wird von Garbage Collector – VladL