私は、C#で最終的に使用するためにC++/CLIでネイティブC++ DLLをラップした状況があります。無効なバリアントクラッシュ
実行時にいくつかの問題を引き起こすコールバック関数がいくつかあります。
が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++コードに直接マップします。回避策として、私はC#側でデリゲートを宣言し、そのファンクションをC++/CLIラッパーに渡します。私はネイティブC + +に中間funcptrを渡し、呼び出しを一緒にデイジーチェーンします。
私が知っていることは、すべてがネイティブのC++世界で動作することです。問題は、void *を管理された世界にマッピングすることです。次のコードは、コールバックのネイティブC++バージョンを示しています。誰もが、私はそれを本当に感謝し、ここに助けることができる場合
int (*CallbackFunction) (void *inst, const void *data);
を。
コールバックは、サードパーティの開発者が提供するヘッダーで定義されています。もし私がそれをVARIANTに変えることができたら、私はそうするでしょう。 IntPtrをC#に渡して、何が起こるかを見てみよう。アップデート予定... – TomO