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

时间:2012-02-01 21:57:17

标签: c# c#-4.0 interop

我正在尝试在托管(C#)和非托管(C ++ Win32)代码之间来回移动数据。我可以使用Marshal.Copy,它可以正常工作,直到数据集变得更大> 2GB作为Marshal.Copy具有签名的32位int(2GB)长度限制。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

在不知道应用程序的具体约束的情况下,也许你无法改变非托管代码,我建议找另一种方法而不是解决框架。