我有一种情况,我用 C++/CLI 包装了一个 Native C++ DLL,以便最终在 C# 中使用。
有一些回调函数会在运行时引起一些问题。特别是,我得到以下异常:
ToadWrapTest.dll 中出现“System.Runtime.InteropServices.InvalidOleVariantTypeException”类型的未处理异常
附加信息:指定的 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++ 代码时引发的 Invalid variant 异常。作为一种尝试的解决方法,我在 C# 端声明了一个委托,并将该 funcptr 传递给 C++/CLI 包装器。然后,我将中介 funcptr 传递给本机 C++,然后将调用以菊花链形式连接在一起。
我所知道的是,这一切都适用于原生 C++ 世界。问题是将 void* 映射到托管世界。以下代码显示了回调的本机 C++ 版本:
int (*CallbackFunction) (void *inst, const void *data);
如果有人可以在这里提供帮助,我将不胜感激。