如何绕过Marshal.Copy(32位)长度限制?

我正在尝试在托管(C#)和非托管(C ++ Win32)代码之间来回移动数据。 我可以使用Marshal.Copy ,它可以正常运行,直到数据集大于2GB,因为Marshal.Copy有一个带符号的32位int(2GB)长度限制。

知道怎么解决这个问题吗? 目前我在托管端使用AllocHGlobal(IntPtr) .ToPointer() ,在非托管端使用AllocHGlobal(IntPtr) 。 如果我不能使用Marshal.Copy来回移动大数据(> 2GB)我可以使用什么?

我的第一反应是:你为什么要复制2GB +的数据?

也许您的应用程序约束不允许它,但在我看来,如果您的数据集大于框架所允许的数据集,那么您不应该寻找绕过框架的技巧。 另一种访问方法怎么样?

有很多方法可以解决这个问题。 对于初学者,您可以将内存包装在流中并将数据拉入非托管代码中。 您还可以创建自己的界面,将数据整合在一起。 内存映射文件也会浮现在脑海中。

在不知道应用程序的特定约束的情况下,也许您无法更改非托管代码,我建议您找到另一种方法而不是解决框架问题。