最終的に C# で使用するために、ネイティブ C++ DLL を C++/CLI でラップした状況があります。
実行時にいくつかの問題を引き起こしているコールバック関数がいくつかあります。特に、次の例外が発生します。
タイプ '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);
誰かがここで助けてくれれば、本当に感謝しています。