【发布时间】:2020-02-20 16:29:00
【问题描述】:
在 Visual Studio 2019 中创建一个简单的控制台 .NET Core 应用现在将默认使用 AnyCPU 平台(未设置 Prefer 32-bit,如 it was with a .NET Framework app)。
然而,如果打开Prefer 32-bit,结果将不再遵循旧逻辑,即生成一个 x86 可执行文件,而是生成一个 x64。
一些快速检查代码:
Console.WriteLine("Initially allocated: {0} bytes", AppDomain.CurrentDomain.MonitoringTotalAllocatedMemorySize);
int noNumbers = 1000000;
object[] objectArray = new object[noNumbers];
Console.WriteLine("Allocated in the end: {0} bytes", AppDomain.CurrentDomain.MonitoringTotalAllocatedMemorySize);
代码输出旁边的平台设置(红色)显示分配的内存量(橙色):
object[] 数组中的元素在 x86 平台上占用 4 个字节,在 x64 平台上占用 8 个字节。输出清楚地表明这是 x64 代码。 VMMap 还根据进程中可见的 64 位虚拟地址确认了这一发现(绿色突出显示):
需要专门选择 x86 作为平台才能获得 32 位可执行文件:
在 Visual Studio 中将 Prefer 32-bit 设置为启用时生成 64 位输出代码是故意更改吗?
在 Windows 10 x64 上的 Visual Studio 2019 16.5 上测试
【问题讨论】:
-
(旁白:您可以通过访问
Environment.Is64BitProcess更轻松地检查您的进程是否以64位运行) -
从您的代码生成的程序集确实打开了该选项。您可以验证但在生成的 dll 上运行 corflags.exe,注意 32BITPREF 标志是如何打开的。但问题是 DLL 不会锁定进程的位数,它是启动 EXE 来完成的。 .NETCore 非常不同,它使用主机。 dotnet.exe 或 VS 项目生成的专用文件。后者遵循平台选择。 Dumpbin.exe /headers 看看吧,机器类型字段。嗯,这有点草率。
-
@CaiusJard:我知道我不久前就所有事物如何结合在一起进行的一项研究,并在此处发布mihai-albert.com/2019/03/10/net-assembly-cross-bitness-loading,但在 .NET Core 中不再完全适用。
-
@MatthewWatson:我知道该属性,甚至查看了确切的实现(与其他评论中的链接相同),但我对 .NET Core 不熟悉,因此我没有想被带去兜风 :) 我的理由是 VMMap 不会撒谎。
标签: c# visual-studio .net-core