将对象转换为void *并返回?

时间:2013-08-07 06:45:24

标签: c# c interop

我正在尝试围绕C function编写一个包含函数指针和任意用户数据(void*)的包装器。函数指针我已经找到了如何处理使用委托,但我无法弄清楚如何将object转换为void*

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

这样的异常
  

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

This "solution"可能对我有用,但我认为必须有一种方法可以将任意数据传递给C DLL,以便以后可以传回来吗?

2 个答案:

答案 0 :(得分:2)

就个人而言,我建议在这里使用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...
}

答案 1 :(得分:2)

如果没有记错,我认为您需要Pointer.BoxPointer.UnBox方法。 这些方法有助于对非托管指针进行装箱和取消装箱。 在msdn。

上查看Pointer.BoxPointer.UnBox