C#使用指针调用奇怪的方法?

C#使用指针调用奇怪的方法?,c#,pointers,com,C#,Pointers,Com,我找到了一个执行directx com导入的代码。但是我不理解它,它在我的代码中也不起作用 这是一个代码: internal unsafe Result GetCapabilities(out BufferCapabilities dSBufferCapsRef) { BufferCapabilities.__Native native = BufferCapabilities.__NewNative(); Result result = (Result) **(((IntPtr

我找到了一个执行directx com导入的代码。但是我不理解它,它在我的代码中也不起作用

这是一个代码:

internal unsafe Result GetCapabilities(out BufferCapabilities dSBufferCapsRef)
{
    BufferCapabilities.__Native native = BufferCapabilities.__NewNative();
    Result result = (Result) **(((IntPtr*) base._nativePointer))[(int) (((IntPtr) 3) * sizeof(void*))](base._nativePointer, (IntPtr) &native);
    dSBufferCapsRef = new BufferCapabilities();
    dSBufferCapsRef.__MarshalFrom(ref native);
    result.CheckError();
    return result;
}
奇怪的一行是方法中的第二行。结果=。。。。 _nativePointer声明如下:

protected unsafe void* _nativePointer;
那么我的答案是,如何才能调用指针所指的共产国际成员。我如何称呼它:(base.\u nativePointer,(IntPtr)&native)。 它是指针nativePointer指向的接口的成员

我知道我有点困惑,但我希望你能理解我的问题。

来自:

*
执行指针间接寻址

->
通过指针访问结构的成员

您将按如下方式使用它们:

指针->字段
(*指针).field

注意:(也来自):

不能将间接运算符应用于void*类型的指针。 但是,可以使用强制转换将空指针转换为任何其他类型 指针类型,反之亦然

看起来有一条主线引起了混乱。我试着把它分解一下:

Result result = (Result) **(((IntPtr*) base._nativePointer))[(int) (((IntPtr) 3) * sizeof(void*))](base._nativePointer, (IntPtr) &native);
第一部分是不言自明的:
Result=(Result).

然后我们有
**((IntPtr*)base.\u nativePointer))
,它似乎是铸造base.\u nativePointer指向一个IntPtr*,然后取消引用它两次。这意味着它必须指向另一个指针。我们取消引用一次以获得指向指针,然后再次获得该指针的值。我们称之为
X

下一部分是
[(int)((IntPtr)3)*sizeof(void*)]
。它获取一个空指针的大小,然后将其乘以3(不要问我为什么要先将其转换为IntPtr)。然后它使用这个值来索引X。它找到X的索引,从它的开始就是3个void*

最后一部分是
(base.\u nativePointer,(IntPtr)&native)
。这告诉我,
X[3 void's]
(上面的伪代码)处的值是一个函数,我们正在调用它


总的来说,代码行调用存储在
base.\u nativePointer
指向的指针中(或附近?)的函数。函数被传递给参数
base.\u nativePointer
&native
(转换为IntPtr),并返回
结果

,但我发布的代码是如何工作的?因为我不明白的是,代码如何能够在没有membername的情况下访问成员。它由[]中的索引访问,然后用()中的参数调用一个方法。我看到您编辑了答案。谢谢。但是我不能调用这个函数。如何调用该函数?我必须将其转换为委托还是什么?是您编写的
GetCapabilities
,还是自动生成的?你想调用什么函数?如果您编写了该函数中的代码,但它不起作用,请尝试将其强制转换为委托。它看起来像是在直接调用COM接口的第四个函数。可能是IDirectSoundBuffer8::GetCaps()。如果您不想维护此代码,请将其扔掉。