2013-04-12 11 views
6

Ich habe in Kreisen gegoogled versucht, ein vollwertiges Beispiel zu diesem, aber ohne Erfolg zu finden.C++/CLI Erben von einer nativen C++ - Klasse mit abstrakten Methoden und aussetzen C#

Ich habe eine C++ - API, die eine Reihe von Klassen präsentiert, die rein virtuelle Methoden enthalten, von denen der Entwickler profitieren kann. Was ich versuche, ist diese Schnittstelle zu C# über die C++/CLI bereitzustellen.

Ich habe es geschafft, die API in die C++/CLI-Bibliothek kompiliert und ich habe einen Knackpunkt erreicht, wie ich neu bin.

Ich bin mir bewusst, dass ich einen Wrapper erstellen muss, um die nicht verwaltete C++/CLI-Klasse einer verwalteten .net-Klasse zugänglich zu machen, aber ich habe kein solides Beispiel oder eine Diskussion gefunden, die zeigt, wie dies mit dem Abstract funktioniert C++ - Klasse.

Kann mir jemand in die richtige Richtung zu einem vollständigen Beispiel einschließlich C# Test-Anwendung zeigen, die das Ende zeigt, wie Sie den Wrapper für eine abstrakte Klasse erstellen. Es scheint ein "Oh du tust do X" Ding zu sein, aber ich kann nicht herausfinden, was X ist :). Ich habe ein paar Beispiele hier gesehen, aber sie sind nicht sehr klar. Es ist ungefähr 3 Jahre her, seit ich mich mit C# beschäftigt habe.

Hoffe jemand kann helfen!

Sammich

+2

Sie können eine verwaltete Ref-Klasse nicht von einer nativen C++ - Klasse ableiten. Sie [müssen] (http://stackoverflow.com/a/2691448/17034) es einkapseln. –

+0

Hallo, Mir ist sehr bewusst, dass es einkapseln muss und dass Sie eine Proxy/Brücke zwischen Ihrer C++ - Klasse für C# bereitstellen müssen. Ich habe eine Reihe von Beispielen gesehen, die gcroot verwenden, aber ihnen fehlen Details. Was ich suche, ist ein End-to-End-Beispiel für diese Art von Kapselung für eine native abstrakte C++ - Klasse. –

+0

Ich habe einen Link zu einem Beispiel gepostet. Es ist mir völlig unklar, warum es nicht geeignet ist. –

Antwort

7

den Code in der von Hans Passant als Basis geschrieben Link verwenden, wird die folgende, was ich denke, die Sie suchen. Es wird nicht so kompiliert, weil ich dieses Beispiel 'inline' geschrieben habe - setze alle Methodenimplementierungen in die .cpp Datei und du solltest dann auf dem richtigen Weg sein.

#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(); 
    } 
}; 
Verwandte Themen