将对象转换为void*并返回

本文关键字:返回 void 对象 转换 | 更新日期: 2023-09-27 18:26:38

我正试图围绕一个C函数编写一个包装器,该函数需要一个函数指针和任意用户数据(void*)。函数指针我已经知道如何使用委托,但我不知道如何将object转换为void*

我可以改为ref object,因为它的行为就像指针AFAIK,但当我尝试时,我会得到一个异常,比如

在从非托管VARIANT转换为托管对象的过程中检测到无效的VARIANT。将无效的VARIANT传递给CLR可能会导致意外的异常、损坏或数据丢失。

这个"解决方案"可能对我有效,但我认为必须有一种方法将任意数据传递到C DLL,以便以后可以将其传递回来?

将对象转换为void*并返回

就我个人而言,我建议在这里使用struct,它更适用于您正在尝试做的事情(此外,如果需要,您可以调整内部布局)。例如,对于struct Foo和引用类型foo:上的字段

unsafe void Bar()
{   
    fixed (Foo* ptr = &foo) // here foo is a field on a reference-type
    {
        void* v = ptr; // if you want void*
        IntPtr i = new IntPtr(ptr); // if you want IntPtr
        // use v or i here...
    }
}

注意:如果foo局部变量,则它在堆栈上,甚至不需要是fixed:

unsafe void Bar()
{
    Foo foo = new Foo();
    Foo* ptr = &foo; // here foo is a local variable
    void* v = ptr; // if you want void*
    IntPtr i = new IntPtr(ptr); // if you want IntPtr
    // use v or i here...
}

如果没有错的话,我认为您需要Pointer.BoxPointer.UnBox方法。这些方法有助于装箱和取消装箱非托管指针。请在msdn中检出Pointer.Box和Pointer.UnBox。