2011-07-24 61 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++代碼,我有簽名

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

上面的代碼工作的大部分時間,但有時它給了AccessViolationException,其他內存可能已損壞的消息。 我對此很陌生,所以不確定這是將對象從C#傳遞給C++的正確方法嗎? 感謝您的任何建議

回答

1

該對象可能被垃圾收集器移動。通常情況下,您只需將一個函數指針傳遞給本地代碼 - 它可以由JIT中的.NET委託生成,這是絕對有效的。這被稱爲反向P /調用。

+0

對象是否被封送? – svick

+0

@svick:No.Net生成一個新的函數,靜態地包含一個對象引用,然後傳遞該函數指針。有效。 – Puppy

+0

謝謝@DeadMG,做這反向P/Invoke甚至適用於非靜態函數嗎?我可以說這個對象實例調用「xyz」方法嗎? – Prakash