使用p / invoke与具有大量静态数据分配的Fortran库进行交互的.Net应用程序在Windows上的静态数据限制低于2 GB时无法加载该库。我成功通过p / invoke加载的最大静态代码大小约为1 GB。如果我编写了一个简单的C程序来加载该库,则可以加载最大1.9 GB的静态数据。两个测试应用程序都是32位的。
托管应用程序尝试通过LoadLibrary加载该库,但失败,并且从Marshal.GetLastWin32Error返回的错误消息是“没有足够的存储空间来处理此命令”。CLR处理非托管库的静态内存分配的方式与C ++运行时将为二进制可执行文件提供的方式有所不同吗?
您也无法在C程序中保证很多,它只需要在基地址上加载一个cr脚的注入DLL,即可将可用地址空间一分为二,并且操作系统不再能够找到足够大的洞来容纳该大洞部分。
在.NET程序中,更糟糕的是,在您的pinvoke调用开始运行时,它已经加载了许多代码和数据。例如,至少有10个堆。通常,最大的漏洞约为650-750 MB,但仅在启动后立即出现。SysInternals的VMMap实用程序可以向您显示该土地的布局。
您几乎没有办法使孔变大。确保您的.NET版本足够新,以便在64位版本的Windows上获得4 GB的地址空间。您的Fortran DLL必须为/ LARGEADDRESSAWARE才能正常工作。重组Fortran代码,使其从堆分配,这肯定是您不想做的事情。是时候开始构建它的64位版本了,这很简单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句