2013-04-12 6 views
6

Byłem googlowania w kółko, próbując znaleźć się pełnoprawną przykład do tego, ale bezskutecznie.C++/CLI Dziedziczenie z natywnym C++ klasy z abstrakcyjnych metod i narażając go na C#

Mam C++ API, który przedstawia szereg zajęć, które zawierają czyste metody wirtualne dla dewelopera rozszerzenie z. Co próbuję zrobić jest zapewnienie tego interfejsu do C# za pośrednictwem C++/CLI.

udało mi się dostać API skompilowany do ++/CLI biblioteki C i już osiągnął kłucia jak jestem nowy na tym.

Jestem świadomy, że muszę utworzyć wrapper, aby odsłonić niezarządzaną klasę C++/CLI zarządzanej klasie .net, ale nie znalazłem solidnego przykładu lub dyskusji, która pokazuje, jak to zrobić z abstraktem Klasa C++.

Czy ktoś może wskazać mi w dobrym kierunku, aby uzyskać pełną przykład w tym C# aplikacji testowej, który pokazuje koniec do końca, jak utworzyć opakowanie dla klasy abstrakcyjnej. Wygląda na to, że jest to "Oh, po prostu Zrób X", ale nie mogę się dowiedzieć, co to X :). Widziałem tutaj kilka przykładów, ale nie są one zbyt jasne. Minęły około 3 lata odkąd zająłem się dowolnym C#.

Nadzieję, że ktoś może pomóc!

Sammich

+2

Nie można wyprowadzić zarządzanej klasy ref z natywnej klasy C++. Musisz [musi hermetyzować] (http://stackoverflow.com/a/2691448/17034). –

+0

Witam, Jestem w pełni świadomy, że potrzebuje hermetyzacji i że musisz dostarczyć proxy/most między swoją natywną klasą C++ do C#. Widziałem wiele przykładów, które używają gcroot, ale brakuje im szczegółów. To, czego szukam, jest końcowym przykładem tego rodzaju enkapsulacji dla natywnej abstrakcyjnej klasy C++. –

+0

Umieściłem link do przykładu. Jest całkowicie niejasne, dlaczego nie jest odpowiedni. –

Odpowiedz

7

Używanie kod w linku wysłana przez Hans Passant jako bazy, po to, co myślę, że szukasz. Nie skompiluje się w ten sposób, ponieważ napisałem ten przykład "inline" - umieść wszystkie implementacje metod w pliku .cpp i powinieneś być na dobrej drodze.

#pragma managed(push, off) 
#include "oldskool.h" 
#pragma comment(lib, "oldskool.lib") 
#pragma managed(pop) 

using namespace System; 

ref class Wrapper; // You need a predeclaration to use this class in the 
        // constructor of OldSkoolRedirector. 

// Overrides virtual method is native class and passes to wrapper class 
class OldSkoolRedirector : public COldSkool { 
public: 
    OldSkoolRedirector(Wrapper ^owner) : m_owner(owner) { } 
protected: 
    virtual void sampleVirtualMethod() { // override your pure virtual method 
     m_owner->callSampleVirtualMethod(); // body of method needs to be in .cpp file 
    } 
private: 
    gcroot<Wrapper^> m_owner; 
} 

public ref class Wrapper abstract { 
private: 
    COldSkool* pUnmanaged; 
public: 
    Wrapper() { pUnmanaged = new OldSkoolRedirector(this); } 
    ~Wrapper() { this->!Wrapper(); } 
    !Wrapper() { 
     if (pUnmanaged) { 
      delete pUnmanaged; 
      pUnmanaged = 0; 
     } 
    } 
protected: 
    virtual void sampleVirtualMethod() = 0; // Override this one in C# 
internal: 
    void callSampleVirtualMethod(){ 
     if (!pUnmanaged) throw gcnew ObjectDisposedException("Wrapper"); 
     sampleVirtualMethod(); 
    } 
};