32位系统每个应用进程都会有自己独立的4GB内存空间,说的是每个进程有4GB的虚拟内存空间,而默认的32位应用当使用的物理内存达到2GB的时候就会报错System.OutOfMemoryException了。
32位应用由于系统限制最高只能使用4GB内存,这是由最大寻址空间决定的,2的32次方.则地址寻址能力是从 0x00000000~0xFFFFFFFF 即为 4GB 大小的容量,实际还要区分用户区和内核预留区。
进程可用的虚拟地址范围称为该进程的“虚拟地址空间” 。 每个用户模式进程都有其各自的专用虚拟地址空间。 对于 32 位进程,虚拟地址空间通常为 2 GB,范围从 0x00000000 至 0x7FFFFFFF,
如下图所示:
我们编译程序时,可以使用IMAGE_FILE_LARGE_ADDRESS_AWARE进行设置,在64位系统下最大支持到4GB内存空间。
C# winform应用支持32位大内存的设定如下:
1. 把启动项目属性,生成标签卡,目标平台设置为Any CPU,然后把prefer 32bit勾上就默认支持大内存了 。(勾选首选32位)
如图所示,如果目标平台已经是AnyCpu,但是无法勾选首选32位的情况.
需要把目标平台改为比Framework 4.5以上就好了(实测4.0以及4.0以下,灰色无法勾选)。
勾选首选32位后,默认就编译就会支持大内存设定了,如果目标平台不是Any CPU,需要特定的x86或者x64的话,则需要使用editbin工具来修改.
下面的editbin修改方法可用于设置低版本的Framework修改(不限版本,推荐使用)。
2.使用EditBin来进行修改。
下载链接:EditBin文件,用于修改.net编译程序的大内存支持.-桌面系统文档类资源-CSDN下载editbin.exe可用于修改.net编译程序的大内存支持.但是并非是只需要单个editbin.更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/chenhui389/85703287
对于32位系统,把x86文件夹里的文件拷贝到C:\Windows\System32\ 目录下面,或者(%systemRoot%\System32\),
对于64位系统,把x86文件夹里的文件拷贝到C:\Windows\SysWOW64\目录下面,或者(%windir%\SysWOW64\), 而x64文件夹里的文件则是拷贝到System32下面
(下图为System,System32,SysWOW64目录的说明)
为了自动修改,也可以添加一个生成后事件命令行,在生成成功时自动执行。
editbin.exe /largeaddressaware $(TargetPath)
入上图所示,这样设置就可以了.在编译完成后,会自动执行生成命令行.
3.用EditBin手动输入cmd命令行修改
cmd命令行操作如下:
rem 切换目录,实际目录不一样,以下载保存的路径为准
cd C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.32.31114\bin\Hostx86\x86\
rem 执行修改
editbin.exe /largeaddressaware E:\Win.exe
pause
rem 查看修改结果
dumpbin /headers E:\Win.exe
pause
执行如图:
dumpbin 的查看结果:
提示 Application can handle large (>2GB) addresses 即为成功。
dumpbin 常用命令补充
dumpbin /? 可以查看帮助信息.
dumpbin /headers E:\Win.exe
使用exports 可以查看导出表,如下:
dumpbin.exe /exports %systemRoot%\system32\url.dll