2013-04-12 12 views
6

Ho cercato su Google in cerchi cercando di trovare un esempio completo a questo ma senza successo.C++/CLI Ereditare da una classe C++ nativa con metodi astratti ed esporla a C#

Ho un'API C++ che presenta un numero di classi che contengono metodi virtuali puri da cui lo sviluppatore può estendersi. Quello che sto tentando di fare è fornire questa interfaccia a C# tramite C++/CLI.

Sono riuscito a ottenere l'API compilata nella libreria C++/CLI e ho raggiunto un punto critico dato che sono nuovo a questo.

Sono consapevole del fatto che ho bisogno di creare un wrapper per esporre la classe non gestita C++/CLI a una classe .net gestita, ma non ho trovato un esempio solido o una discussione che mostra come farlo con un abstract Classe C++.

Qualcuno può indicarmi la direzione giusta per un esempio completo che includa un'applicazione di test C# che mostri la fine alla fine di come creare il wrapper per una classe astratta. Sembra essere una cosa "Oh, devi solo fare X" ma non riesco a scoprire cosa sia X :). Ho visto alcuni esempi qui ma non sono molto chiari. Sono passati circa 3 anni da quando ho affrontato qualsiasi C#.

Spero che qualcuno possa aiutarti!

Sammich

+2

Non è possibile derivare una classe di riferimento gestito da una classe C++ nativa. Tu [devi incapsulare] (http://stackoverflow.com/a/2691448/17034) esso. –

+0

Ciao, Sono molto consapevole del fatto che ha bisogno di incapsulare e che è necessario fornire un proxy/bridge tra la classe nativa C++ a C#. Ho visto un certo numero di esempi che usano gcroot ma non hanno dettagli. Quello che sto cercando è un esempio end-to-end di questo tipo di incapsulamento per una classe C++ astratta nativa. –

+0

Ho pubblicato un collegamento a un esempio. Non mi è del tutto chiaro perché non sia adatto. –

risposta

7

Utilizzando il codice nel link postato da Hans Passant come base, il seguente è quello che penso che stai cercando. Non verrà compilato in questo modo perché ho scritto questo esempio 'inline' - metti tutte le implementazioni del metodo nel file .cpp e dovresti quindi essere sulla strada giusta.

#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(); 
    } 
}; 
Problemi correlati