我正在尝试围绕C function编写一个包含函数指针和任意用户数据(void*
)的包装器。函数指针我已经找到了如何处理使用委托,但我无法弄清楚如何将object
转换为void*
。
我可以改为ref object
,因为它的行为就像指针AFAIK,但是当我尝试时,我会得到一个像
在从非托管VARIANT到托管对象的转换过程中检测到无效的VARIANT。将无效的VARIANT传递给CLR可能会导致意外的异常,损坏或数据丢失。
This "solution"可能对我有用,但我认为必须有一种方法可以将任意数据传递给C DLL,以便以后可以传回来吗?
答案 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.Box
和Pointer.UnBox
方法。
这些方法有助于对非托管指针进行装箱和取消装箱。
在msdn。