2011-07-24 16 views
1

C#クラスのオブジェクトをC++に渡し、ネイティブのC++コードで渡されたオブジェクトのメソッドを呼び出したいとします。プレーンなC#オブジェクトをC++に渡して、そのオブジェクトのメソッドを呼び出す

Public class MyClass{ 
    { 
     bool IsThisValid() 
     { 
      IsValid(this);//Check the Native passing it this object 
     } 
     [DllImport("mylibraryinCpp.dll", EntryPoint="IsValid", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall) ]  
     static internal extern bool IsValid(object); 
    }//end of class 

今、このオブジェクトを取得し、その上にいくつかの操作を実行するためのC++のコードをしたいです。私は署名がネイティブC++コードで 上記のコードは、時間のほとんどが動作しているが、時にはそれがAccessViolationExceptionを与えている

//Native C++ code mylibraryinCpp.dll 
    extern "C" __declspec(dllexport) BOOL __stdcall IsValid (VARIANT theObject) 
    { 
((mscorlib::_object*)(thObject.pdispVal))->get_ToString(bstrStringVal);//AccessViolationException occurs here. 
    } 

ように、他のメモリが破損したメッセージであるかもしれません。 私はこれを初めて知っているので、C#からC++にオブジェクトを渡す正しい方法は不明ですか? ご意見ありがとうございました

答えて

1

オブジェクトはガベージコレクタによって移動される可能性があります。通常、ネイティブコードへの関数ポインタを渡すだけです。これは、JITによって.NETのデリゲートから生成できます。これは間違いなく機能します。これは逆P /呼び出しと呼ばれます。

+0

オブジェクトはマーシャリングされませんか? – svick

+0

@svick:いいえ.Netは、静的にオブジェクト参照を持つ新しい関数を生成し、その関数ポインタを渡します。効果的に。 – Puppy

+0

ありがとう@DeadMG、この逆P/Invokeは静的ではない関数に対しても適用できますか?このオブジェクトインスタンスの "xyz"メソッドを呼び出すことはできますか? – Prakash

関連する問題