我有一種情況,我用C++封裝了一個本機C++ DLL,以便在C#中最終使用。變量崩潰無效
有幾個回調函數在運行時導致一些問題。特別是,我得到以下異常:
型 'System.Runtime.InteropServices.InvalidOleVariantTypeException' 未處理的異常 發生在ToadWrapTest.dll
其他信息:指定OLE 變種是無效的。
在這行代碼(C++/CLI):
public delegate int ManagedCallbackFunction (Object^ inst, const Object^ data);
public delegate int UnManagedCallbackFunction (void* inst, const void* data);
ManagedCallbackFunction^ m_callbackFn;
int intermidiaryCallback(void * pInstance, const void * pData)
{
void* temp = (void*)pData;
System::IntPtr ip1 = IntPtr(pInstance);
System::IntPtr ip2 = IntPtr(temp);
Object^ oInst = Marshal::GetObjectForNativeVariant(ip1);
Object^ oData = Marshal::GetObjectForNativeVariant(ip2);
//invoke the callback to c#
//return m_callbackFn::Invoke(oInst, oData);
return 0;
};
我做了這個「中介回調」的原因是試圖規避無效的變種異常,當我試圖拋出直接將來自C#的委託映射到本地C++代碼。作爲嘗試的解決方法,我在C#端聲明一個委託並將該funcptr傳遞給C++/CLI包裝器。然後,我將中間funcptr傳遞給本機C++,並將這些調用菊花鏈連接在一起。
我所知道的是,它都適用於本機C++世界。問題在於將void *映射到託管的世界。下面的代碼顯示了本地C++版本回調:
int (*CallbackFunction) (void *inst, const void *data);
如果任何人都可以在這裏幫助,我會很感激。
回調是由第三方開發者提供了一個頭文件中定義。如果我可以改變它到VARIANT,我會的。我會嘗試將IntPtr傳遞給C#,然後看看會發生什麼。更新即將發佈... – TomO 2009-07-30 23:37:25