c# - 无效的变体崩溃

标签 c# exception interop c++-cli variant

我有一种情况,我用 C++/CLI 包装了一个 native C++ DLL,以便最终在 C# 中使用。

有一些回调函数会在运行时引起一些问题。特别是,我得到以下异常:

An unhandled exception of type 'System.Runtime.InteropServices.InvalidOleVariantTypeException' occurred in ToadWrapTest.dll

Additional information: Specified OLE variant is invalid.

在这行代码中(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;
    };

我进行此“中间回调”的原因是试图规避在我尝试将委托(delegate)从 C# 直接映射到 native C++ 代码时抛出的无效变体异常。作为一种尝试性的解决方法,我在 C# 端声明了一个委托(delegate)并将该 funcptr 传递给 C++/CLI 包装器。然后,我将中间 funcptr 传递给 native C++,并将调用菊花链在一起。

据我所知,这一切都适用于原生 C++ 世界。问题是将 void* 映射到托管世界。以下代码显示了回调的 native C++ 版本:

int (*CallbackFunction) (void *inst, const void *data);

如果有人能在这里提供帮助,我将不胜感激。

最佳答案

pInstance 和 pData 真的是 VARIANT 吗?如果是,我希望您的回调函数具有更强类型:

int (*CallbackFunction)(VARIANT *inst, VARIANT *data);

如果是这样,在您的代码中您应该能够查看实际的 VARIANT亲自检查一下。如果您没有真正获得 VARIANT(即,您实际上只是获得 void * 指针),则不应尝试将它们转换为 C# 对象,因为它们没有内在含义。它们应该作为 IntPtr 传递。如果您知道它们应该具有某些其他类型的固有含义,则需要将它们编码为适当的类型。

关于c# - 无效的变体崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1206784/

相关文章:

c# - Perl 的重复运算符在 C# 中的等效项是什么?

android - IllegalArgumentException:指定为非null的参数为null

c++ - 从 c 调用 swift

c# - C# 中的 4 位枚举

c# - 如何使用 c# 中未注册的 dll?

c# - 为什么工作目录是可执行文件的目录而不是我运行的目录?

c# - DataGridViewTextBoxCell.ReadOnly = true,但仍然可以更改所选值

c# - 将字符串 "172406"快速转换为整数 17、24、06

c# - 为什么使用 WebClient 的 UploadFileAsync 没有错误通知?

.net - 使用 WCF 和 DefaultCredentials 时如何处理密码更改?