0

静的な.Netメソッドがあると仮定しましょう

static void RegisterDelegate(Action<array<Object^>^>^ handler);

一部のアセンブリで定義されているため、変更できません。

私は次のコードを持っています:

static void HandleCallback(Action<array<Object^>^>^ handler, NATIVE_CPP_TYPE *nativeObject){
    //some code here
}

static void TestCall(NATIVE_CPP_TYPE *nativeObject){
    //RegisterDelegate(??);
}

ここで、NATIVE_CPP_TYPEはシリアル化不可能でネイティブのみのタイプであり、どちらも変更できません。

を呼び出すとTestCall(ptrToObj)、タイプのデリゲートが作成されますAction<array<Object^>^>。このデリゲートはHandleCallback、呼び出されたときに呼び出し、独自の引数(Object配列)と、TestCall関数に最初に渡されたネイティブObjectへのポインターの両方を渡す必要があります。したがって、ポインタはある種のクロージャに格納する必要があります。

これをどのように行うことができるか考えていますか?名前空間について考えましたSystem::Linq::Expressionsが、そのような式でネイティブオブジェクトをカプセル化することはできません。

前もって感謝します!

4

1 に答える 1

2

私の知る限り、C ++/CLIではマネージドラムを実行できません。もちろん、ネイティブ型を格納する独自のクラスを作成してから、デリゲートとして使用するメソッドを公開することもできます。

public ref class ManagedClass
{
    static void RegisterDelegate(Action<array<Object^>^>^ handler)
    {

    }
};

class NATIVE_CPP_TYPE
{

};

static void HandleCallback(array<Object^>^ handler, NATIVE_CPP_TYPE *nativeObject)
{     
    //some code here 
}  

public ref class HandleCallbackWithNativeType
{
    NATIVE_CPP_TYPE * m_pNativeObject;

public:
    HandleCallbackWithNativeType(NATIVE_CPP_TYPE *nativeObject)
    {
        m_pNativeObject = nativeObject;
    }

    void Execute(array<Object^>^ array)
    {
        HandleCallback(array, m_pNativeObject);
    }
};


static void TestCall(NATIVE_CPP_TYPE *nativeObject)
{
    // This type will act as your closure "capturing" nativeObject.
    HandleCallbackWithNativeType ^ pHandler = gcnew HandleCallbackWithNativeType(nativeObject);
    Action<array<Object^>^>^ handler = gcnew Action<array<Object^>^>(pHandler, &HandleCallbackWithNativeType::Execute);
} 

ラムダ構文ほど便利ではありませんが、機能します。

于 2012-06-29T12:50:50.253 に答える