2013-04-12 26 views
6

Bu konuda tam bir örnek bulmaya çalışan çevrelerde dolaşıyorum ama boşuna.C++/CLI Özgün bir C++ sınıfından soyut yöntemlerle miras alma ve onu C# olarak gösterme # #

Geliştiricinin genişletmesi için saf sanal yöntemler içeren bir dizi sınıf sunan bir C++ API'ım var. Yapmaya çalıştığım şey, C++/CLI aracılığıyla bu arabirimi C# 'ye sağlamaktır.

API'yi C++/CLI kitaplığına derlemeyi başardım ve bunun için yeni olduğum gibi bir bağlama noktasına ulaştım.

C++/CLI yönetilmeyen sınıfı yönetilen bir .net sınıfına ifşa etmek için bir sarıcı oluşturmanız gerektiğinin farkındayım, ancak bunun bir özetle nasıl yapıldığını gösteren bir katı örnek veya tartışma bulamadım. C++ sınıfı.

Kimse bana doğru yönde tam bir örneğe, C# sınama uygulaması da dahil olmak üzere, özet bir sınıf için sarıcının nasıl oluşturulacağını gösteren son noktayı gösterebilir. “Oh, sadece X” bir şey gibi görünüyor ama X'in ne olduğunu öğrenemiyorum :). Burada birkaç örnek gördüm ama çok net değiller. Herhangi bir C# ile uğraştığımdan yaklaşık 3 yıl geçti.

Birisi size yardımcı olabilir umarım! temel olarak Hans Passant tarafından haberi bağlantı kodu kullanarak

Sammich

+2

Yerel C++ sınıfından yönetilen bir ref sınıfı türetemezsiniz. Sen (kapsüllemek zorundasın) (http://stackoverflow.com/a/2691448/17034). –

+0

Merhaba, Kapsama ihtiyacı duyduğunu ve C++ yerel sınıfınız C# arasında bir proxy/köprü sağlamanız gerektiğinin farkındayım. Gcroot kullanan birkaç örnek gördüm, ancak detaylardan yoksunlar. Aradığım şey, yerel bir soyut C++ sınıfı için bu tür bir kapsülleme örneğinin sonudur. –

+0

Bir örneğe bir link gönderdim. Bana neden uygun olmadığı belli değil. –

cevap

7

aşağıdaki Ben aradığınız düşünüyorum şeydir. Bu şekilde derlemeyeceğim çünkü bu örneği 'satır içi' yazdım - .cpp dosyasına tüm yöntem uygulamalarını koyun ve daha sonra doğru yolda olmalısınız.

#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(); 
    } 
}; 
İlgili konular