6

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

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

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

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

4

2 回答 2

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...
}
于 2013-08-07T06:57:51.490 回答
2

如果没记错的话我认为你需要Pointer.BoxPointer.UnBox方法。这些方法有助于对非托管指针进行装箱和拆箱。查看msdn 上的Pointer.BoxPointer.UnBox

于 2013-08-07T07:05:05.283 回答