2013-04-12 13 views
6

私は、完全に本格的な例を見つけようとしていますが、無駄です。C++/CLI抽象メソッドを持つネイティブC++クラスから継承し、C#に公開する

私は、開発者が拡張するための純粋な仮想メソッドを含む多くのクラスを提供するC++ APIを持っています。私がしようとしているのは、C++/CLIを介してC#にこのインターフェイスを提供することです。

私はAPIをC++/CLIライブラリにコンパイルすることができましたが、私はこのことを念頭に置いています。

C++/CLIのアンマネージドクラスをマネージド.netクラスに公開するためにラッパーを作成する必要があることを知っていますが、抽象的な方法でこれを行う方法を示す実例やディスカッションは見つかりませんでしたC++クラス。

抽象クラス用のラッパーを作成する方法の終わりから終わりまでを示すC#テストアプリケーションを含む完全な例を、誰かが正しい方向に向けることができます。それは "ああ、ちょうどXをする"ものであるように見えますが、私はXが何であるかを知ることはできません:)。私はここでいくつかの例を見てきましたが、あまり明確ではありません。私はC#に取り組んでから約3年が経ちました。

誰かが助けてくれることを願っています!

ベースとしてハンスアンパッサンにより投稿されたリンク内のコードを使用してSammich

+2

ネイティブC++クラスから管理参照クラスを派生させることはできません。あなたはそれをカプセル化しなければなりません(http://stackoverflow.com/a/2691448/17034)。 –

+0

こんにちは、 私はカプセル化が必要で、C++ネイティブクラスとC#との間にプロキシ/ブリッジを用意する必要があることを非常に認識しています。私はgcrootを使用する多くの例を見てきましたが、詳細は不足しています。私が探しているのは、ネイティブな抽象C++クラスのカプセル化のこのタイプの例です。 –

+0

例へのリンクを投稿しました。なぜそれが適切でないのか私には完全には不明です。 –

答えて

7

、以下は、私はあなたが探していると思うものです。私はこの例を「インライン」と書いているので、このようにはコンパイルされません。すべてのメソッドの実装を.cppファイルに入れて、次に適切なトラックに置く必要があります。

#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(); 
    } 
}; 
関連する問題