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

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

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

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

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

就个人而言,我建议在这里使用一个struct ,这更适用于你想要做的事情(如果你需要,你可以调整内部布局)。 例如,使用struct Fooreference-type 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 。