将对象转换为void*并返回
本文关键字:返回 void 对象 转换 | 更新日期: 2023-09-27 18:26:38
我正试图围绕一个C函数编写一个包装器,该函数需要一个函数指针和任意用户数据(void*
)。函数指针我已经知道如何使用委托,但我不知道如何将object
转换为void*
。
我可以改为ref object
,因为它的行为就像指针AFAIK,但当我尝试时,我会得到一个异常,比如
在从非托管VARIANT转换为托管对象的过程中检测到无效的VARIANT。将无效的VARIANT传递给CLR可能会导致意外的异常、损坏或数据丢失。
这个"解决方案"可能对我有效,但我认为必须有一种方法将任意数据传递到C DLL,以便以后可以将其传递回来?
就我个人而言,我建议在这里使用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.Box
和Pointer.UnBox
方法。这些方法有助于装箱和取消装箱非托管指针。请在msdn中检出Pointer.Box和Pointer.UnBox。