昨天刚分享了《如何让.NET应用使用更大的内存》,结果就有同学说,<最好加一下32位如何开启大内存,因为很多传统项目32位,实在迁移不动了>,那么,我就验证了一些可行的方案,发现都挺简单的。
如何查看 Large Address Aware(大地址感知 [3G开关] )
最常用的工具就是dnSpy(在参考资料里,可以下载)
打开这个软件,把我们验证的MemeryTest (32) 应用程序直接拖拉进去,就会显示我们的程序集相关信息,在我的步骤第二步,编辑模块,就可以看到这个应用程序的PE头里的信息。
可以看到,默认是i386 机器,默认的 Larg Address Aware 是没有被选中的。
而 64位应用程序 默认是 AMD64机器,默认 Large Address Aware 是被选中的,也符合昨天分享文章中所说的,64位应用默认是开启的。
.Net 8应用
我刚好也验证了一下最新刚出来的.Net 8 应用程序,也发现,它的头部信息在 dnSpy里是如下所示
直接在文件头项里就能看到结果了
如何修改使能 Large Address Aware(大地址感知 [3G开关] )
dnSpy
最简单的方案就是使用dnSpy,
直接打对钩,然后,保存项目即可。
再次打开,发现已经被修改了
editbin.exe和dumpbin.exe Visual Studio 自带工具
我这边的工具路径在
csharp
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.38.33130\bin\Hostx86\x86
然后,通过以下相关命令,来修改(使能)应用的3G开关。
csharp
.\editbin.exe /largeaddressaware "E:\MemoryTest.exe"
通过以下命令来查看,是否修改成功
csharp
.\dumpbin.exe /headers "E:\MemoryTest.exe"
具体例子如下:
默认查看32位应用,是没有开启的
通过输入
csharp
.\editbin.exe /largeaddressaware "E:\MemoryTest\bin\x86\Debug\MemoryTest.exe"
以下是输入后的样子
设置完之后,再次查看,已经开启了。
dotnetCampus.LargeAddressAware
我也是在搜索的时候发现这个优秀的库的,我看它的介绍是,支持 .NET Core 和 .NET Framework的。
使用方法也很简单,直接nuget 应用 <dotnetCampus.LargeAddressAware> 包即可。
编译生成后,直接就看到,它已经打开3G的开关了。
使用方法是特别的简单
实际原理分析
从这个图就可以看到,实际上它也是用了微软提供的工具来进行修改的。
从项目中也可以看到,它是通过编译的时候,顺便把开关给你开开。一种不错的解决方案。
总结
这种还在使用32位应用的场景大部分都是传统老的项目还在运行在很老的环境上,衷心希望这样长久的项目以后也越来越多(以后几百G的内存应该比比皆是了)。
再次感谢有反馈的大佬。
代码地址
https://github.com/kesshei/MemeryTest.git
https://gitee.com/kesshei/MemeryTest.git
参考资料地址
csharp
《dnspy》
https://github.com/dnSpy/dnSpy
《dotnetCampus.LargeAddressAware》
https://github.com/dotnet-campus/dotnetCampus.LargeAddressAware
阅
一键三连呦!,感谢大佬的支持,您的支持就是我的动力!