我能否在Visual Studio中设置LARGEADDRESSAWARE?

68

我有一个 .NET 程序集需要是32位的,并且需要设置 /LARGEADDRESSAWARE

我知道可以使用 EditBin 来完成此操作,但我想知道在 Visual Studio 2010 中是否有内置的方法?或者,是否有人为此编写了 MSBuild 任务?

编辑:这是针对 C# 应用程序的,所以不幸的是没有链接器选项 :(

4个回答

99

在@ RouMao的回答上进行完善,您可能会收到一个错误消息,其中提示无法找到editbin。 通过指定以下方式,确保后构建事件命令行中的环境设置正确:

call "$(VS100COMNTOOLS)..\tools\vsvars32.bat"
editbin /largeaddressaware $(TargetPath)

另一个需要理解的是,启用了LARGEADDRESSAWARE的应用程序在调试模式下不会运行,因为(在项目属性的Debug选项卡下)默认勾选了启用Visual Studio托管进程复选框,这会导致vshost.exe未被正确标记。

取消该复选框以使用LARGEADDRESSAWARE调试您的应用程序。


20
对于VS 2013,您需要将第一行更改为call "$(DevEnvDir)..\tools\vsvars32.bat" - WiiMaxx
11
对于那些使用VS 2012的人,第一行是 call "$(VS110COMNTOOLS)..\tools\vsvars32.bat" - agez
13
别忘了在你的 $(TargetPath) 周围加上引号,变成 "$(TargetPath)" - Freestyle076
对于VS2010,我也使用$(DevEnvDir),就像@WiiMaxx提到的那样。 - ToolmakerSteve
5
快速更新 - 由于路径发生了变化,因此在VS2017中DevEnvDir不再起作用(请参见https://dev59.com/lFgQ5IYBdhLWcg3wazMi)。最终我不得不使用$(VS140COMNTOOLS)。 - Nick Shaw
基于 @RouMao 的回答。我猜他们的名字已经改变了,是哪个回答?被采纳的那一个吗? - StayOnTarget

50
你可以将其作为后置构建任务执行。在“构建事件”选项卡中,输入以下命令。
editbin /largeaddressaware $(TargetPath)

在“生成后事件命令行:”中输入。

这适用于VS2008,我认为在VS2010中应该也是同样的方式运作。


7
这个方法非常有效,但如果你使用ClickOnce进行发布,请注意它会使用**obj文件夹中的文件而不是bin文件夹中的文件进行发布。为了同时处理正常生成输出(用于调试/本地运行)和ClickOnce发布,你需要在Post Build事件中对两个**目录运行editbin。我还建议将TargetPath宏用引号括起来。 - Nick
一定要查看Kirill的回答。他的NuGet包非常有帮助。 - dss539

24

这个 nuget 包添加后,largeaddressaware 会自动设置吗?还是我需要在代码中做些什么? - CyclingFreak
1
添加NuGet包并设置<LargeAddressAware>true</LargeAddressAware>以启用它。确保从NuPkg中包含.targets文件在您的构建中。为此,请使用http://msbuildlog.com构建您的项目,并在结构化日志中搜索"LargeAddressAware"。 - Kirill Osenkov
4
尽管需要手动编辑项目文件,但会大大简化,至少不必处理环境变量和尝试安装正确版本的VC++构建工具等疯狂情况。我建议将<LargeAddressAware>标签放在条件为x86平台的<PropertyGroup>中。 - jpmc26
您需要对项目中的DLL文件以及exe文件都进行此操作,还是只需要对exe文件进行操作就可以了? - rollsch
2
@rolls 只需要 exe - Kirill Osenkov
显示剩余2条评论

10
如果你使用以下方式编译你的汇编代码:
<PlatformTarget>AnyCPU</PlatformTarget>
<Prefer32Bit>true</Prefer32Bit> <!--Default !false!-->

如果你的汇编代码是 AnyCPU 的,那么它会自动获得 LARGE ADDRESS AWARE 标志。

根据 Why does 'Any CPU (prefer 32-bit)' allow me to allocate more memory than x86 under .NET 4.5?的描述,使用VS 2019测试成功(需要Visual Studio 2015+)。

因此,在大多数情况下,您不需要采取任何特殊措施。您的 AnyCPU 汇编代码将默认在 x86 + LAA 下执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接