首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Net处理非托管内存是否与C++运行时/二进制可执行文件不同?

.Net处理非托管内存是否与C++运行时/二进制可执行文件不同?
EN

Stack Overflow用户
提问于 2015-11-30 20:36:34
回答 1查看 165关注 0票数 3

使用p/invoke与具有大量静态数据分配的Fortran库交互的.Net应用程序在Windows上完全低于2GB静态数据限制时无法加载该库。通过p/invoke成功加载的最大静态代码大小约为1GB。如果我编写一个加载库的简单C程序,我可以加载高达1.9GB的静态数据大小。这两个测试应用程序都是32位的。

托管应用程序试图通过失败的LoadLibrary加载库,从Marshal.GetLastWin32Error返回的错误消息是“没有足够的存储空间来处理此命令”。CLR处理非托管库静态内存分配的方式与C++运行时提供的二进制可执行文件有什么不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-30 21:16:00

在一个C程序中也没有太多的保证,它只需要在一个基础地址加载一个糟糕的注入DLL,它可以将可用的地址空间分成两部分,并且操作系统再也找不到一个足够大的洞来适应这个巨大的部分。

更糟糕的是,在.NET程序中,当pinvoke调用开始运行时,它已经加载了大量的代码和数据。例如,至少有10堆。最大的漏洞一般在650-750兆字节之间,但只有在启动后才会立即出现。SysInternals的VMMap实用程序可以显示土地的布局。

你几乎没办法把这个洞弄大。确保您的.NET版本是最近的,因此它在64位版本的Windows上有一个4GB的地址空间。您的Fortran需要是/LARGEADDRESSAWARE才能工作。重构Fortran代码,这样它就可以从堆中分配,这肯定是您不想做的事情。现在是开始构建64位版本的时候了,这很简单。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34007534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档