8

私は、これに対する本格的な例を見つけようとして、ぐるぐる回っていましたが、役に立ちませんでした。

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

API を C++/CLI ライブラリにコンパイルすることができました。

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

抽象クラスのラッパーを作成する方法のエンド ツー エンドを示す C# テスト アプリケーションを含む完全な例を正しい方向に向けることができますか? 「ああ、あなたはXをやるだけ」のように見えますが、Xが何であるかわかりません:)。ここでいくつかの例を見てきましたが、あまり明確ではありません。C#に取り組み始めて約3年。

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

サミッチ

4

1 に答える 1

8

Hans Passant によって投稿されたリンクのコードをベースとして使用すると、次のものが探していると思います。この例は「インライン」で記述したため、このようにはコンパイルされません。すべてのメソッドの実装を .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(); 
    }
};
于 2013-04-13T12:08:39.220 に答える