如何获得指向 MemoryStream 的固定指针?

How do I get a fixed pointer to a MemoryStream?

我有一个内存流对象,我需要一个固定的指针(我正在使用 VB.net,我认为这等同于 IntPtr)。我需要这个,因为需要一个指针 (IntPtr) 作为另一个函数(我无法修改)的输入参数。

我以前没有使用过不安全的代码,我知道这可能是必需的。如果需要,我可以切换到 C#。

我在这里 (https://www.c-sharpcorner.com/article/pointers-in-C-Sharp/) 读到“我们可以说指针只能指向非托管类型,其中包括所有基本数据类型、枚举类型、其他指针类型和仅包含非托管类型的结构。”

这解释了为什么将内存流包装在一个结构中并使用下面的代码不起作用(myTest 是一个包含内存流的结构)

Dim gcHandle As GCHandle = GCHandle.Alloc(myTest, GCHandleType.Pinned)
Dim thePointer As IntPtr = Marshal.ReadIntPtr(GCHandle.ToIntPtr(gchandle))

所以我的问题是如何使用 VB.net(首选)或 C# 获取指向我的 memorystream 对象的固定指针?我正在使用 .NET Framework 4.7.2。

这是我根据评论中的输入使用的代码:


Dim bytes As Byte() = MyMemoryStream.ToArray()
Dim gcHandle As GCHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned)
Dim myPointer As IntPtr = gcHandle.AddrOfPinnedObject()

基本上你必须将内存流转换为字节数组。然后您可以固定此数组并获取指向它的指针。

再次感谢所有评论者!