2011-07-01 7 views
2

Refを介してrefクラスインスタンス上でネイティブポインタを返すメソッドを呼び出そうとしています。Refを介してrefクラスインスタンス上のメソッドを呼び出すと、ネイティブポインタが返されます。

例REFクラス・ヘッダ:

public ref class MyRefClass : public IDisposable 
{ 
public: 

MyNativeType* GetNativeInstance(); 

//Rest of the header... 
} 

ここではデリゲートを作成しようとする場合、このデリゲートを

delegate MyNativeType* GetNativeInvoker(); 

を用いた反射

void InvokeTheMethod(Object^ obj) 
{ 
    MyNativeType* myNative; 
    GetNativeInvoker^ del = (GetNativeInvoker^) Delegate::CreateDelegate(GetNativeInvoker::typeid, obj, "GetNativeInstance"); 

    //get pointer and use if bind succeeds myNative = del(); 
    //else handle the case where the Object does not have GetNativeInstance() 
} 

に失敗した試みの一例ですobjectがtを持つrefクラスのインスタンスであっても、バインドはArgumentExceptionで失敗します彼は方法 "GetNativeInstance"(のようなMyRefClass)。この問題は、Object^という事実以外のコンパイル時にobjの型について何も知らなくても解決されなければならない。

答えて

2

問題はあなたがReflectionを使用していないことです。 Delegate :: CreateDelegate()はデリゲート型でのみ使用できますが、あなたは1つではありません。リフレクションを使用して修正するには、Type :: GetMethod()がメソッドを返します。このように(除外除外):

using namespace System; 
using namespace System::Reflection; 

class MyNativeType {}; 

public ref class MyRefClass 
{ 
    MyNativeType* instance; 
public: 
    delegate void* GetNativeInvoker(); 

    MyRefClass() { instance = new MyNativeType; } 
    MyNativeType* GetNativeInstance() { return instance; } 

    static void Test() { 
     MyRefClass^ obj = gcnew MyRefClass; 
     MethodInfo^ mi = obj->GetType()->GetMethod("GetNativeInstance"); 
     Object^ result = mi->Invoke(obj, nullptr); 
     void* ptr = Pointer::Unbox(result); 
     System::Diagnostics::Debug::Assert(ptr == obj->GetNativeInstance()); 
    } 
}; 
+0

ありがとうございます。MethodInfoを使用してください。私は間違ってCreateDelegateがメソッドにバインドするリフレクションを使用していると推測します。ここで私が気になる主なことは、GetNativeInvokerがデリゲート型であると思ったことです。戻り値にはこれと関連がありますか? – insipid

+0

Erm、私がコードを作業したときには意味がありました。もう覚えていない。限り、それは動作します。 –

関連する問題