我可以在 Visual Studio 中设置 LARGEADDRESSAWARE 吗?

Posted

技术标签:

【中文标题】我可以在 Visual Studio 中设置 LARGEADDRESSAWARE 吗?【英文标题】:Can I set LARGEADDRESSAWARE from within Visual Studio? 【发布时间】:2011-02-05 13:38:57 【问题描述】:

我有一个需要为 32 位且需要为 /LARGEADDRESSAWARE 的 .NET 程序集。

我知道如何使用EditBin 执行此操作,但我想知道 Visual Studio 2010 中是否有内置方法?或者,是否有人为此编写了 MSBuild 任务?

编辑:这是一个 C# 应用程序,所以遗憾的是没有链接器选项:(

【问题讨论】:

【参考方案1】:

基于@RouMao 的回答,您可能会收到一条错误消息,指出找不到 editbin。通过如下指定确保构建后事件命令行中的环境设置正确:

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

要了解的另一件事是,当(在项目属性中的 Debug 选项卡下)选中 Enable the Visual Studio hosting process 复选框(默认情况下)时,启用 LARGEADDRESSAWARE 的应用程序将不会在调试模式下运行,因为 vshost.exe 未正确标记。

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

【讨论】:

对于 VS 2013,您需要将第一行更改为 call "$(DevEnvDir)..\tools\vsvars32.bat" 对于那些使用 VS 2012 的人来说,第一行是call "$(VS110COMNTOOLS)..\tools\vsvars32.bat" 别忘了将$(TargetPath) 用引号括起来"$(TargetPath)" 对于VS2010,我也使用@WiiMaxx提到的$(DevEnvDir) 快速更新 - 由于路径的变化,DevEnvDir 自 VS2017 起不再工作(请参阅***.com/questions/42805662/…)。我最终不得不使用 $(VS140COMNTOOLS)【参考方案2】:

您可以将其作为构建后任务来完成。在“构建事件”选项卡中,输入以下命令

editbin /largeaddressaware $(TargetPath)

进入“构建后事件命令行:”

VS2008 就是这种情况。我认为它应该以与 VS2010 相同的方式工作。

【讨论】:

这很好用,但如果您使用 ClickOnce 发布,请注意它使用 obj 文件夹中的文件而不是 @ 中的文件发布987654324@。要涵盖正常的构建输出(用于调试/本地运行)以及 ClickOnce 发布,您需要在 Post Build 事件中针对 both 目录运行 editbin。我还建议将 TargetPath 宏用引号括起来。 请务必查看 Kirill 的回答。他的 nuget 包非常有帮助。 ***.com/a/45182578/55721【参考方案3】:

这是一个 NuGet 包,可以在构建二进制文件后设置 LargeAddressAware:https://github.com/KirillOsenkov/LargeAddressAware

它不需要 editbin.exe,因为它有一个托管应用程序以编程方式设置标志:https://github.com/KirillOsenkov/LargeAddressAware/blob/master/SetLargeAddressAware/LargeAddressAware.cs

更新: 要使用它,只需安装包并将此属性添加到您的 .csproj 中:

<PropertyGroup>
  <LargeAddressAware>true</LargeAddressAware>
</PropertyGroup>

【讨论】:

添加这个 nuget 包后会自动设置 largeaddressaware 吗?或者我需要在我的代码中做些什么? 添加 NuGet 包并设置 true 以将其打开。确保来自 NuPkg 的 .targets 文件包含在您的构建中。为此,请使用msbuildlog.com 构建您的项目并在结构化日志中搜索“LargeAddressAware”。 Massively 更简单,尽管需要手动编辑项目文件。至少您不必处理环境变量并尝试安装正确版本的 VC++ 构建工具所有这些疯狂。不过,我确实建议将 &lt;LargeAddressAware&gt; 标记放在 x86 平台上的 &lt;PropertyGroup&gt;s 中。 您需要对项目中的 DLL 文件以及 exe 执行此操作,还是只需要 exe? @rolls 只是 exe【参考方案4】:

如果你编译你的程序集:

<PlatformTarget>AnyCPU</PlatformTarget>
<Prefer32Bit>true</Prefer32Bit> <!--Default !false!-->

您生成的程序集将自动收到LARGE ADDRESS AWARE 标志。

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

因此,在大多数情况下,您不需要任何特殊操作。默认情况下,您的 AnyCPU 程序集将在 x86 + LAA 下执行。

【讨论】:

以上是关于我可以在 Visual Studio 中设置 LARGEADDRESSAWARE 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio / OpenGL 中设置 GPU [重复]

如何在visual studio 2013中设置角度2?

有没有办法在Visual Studio Code中设置环境变量?

使用 Visual Studio 构建任务在 azure devops 中设置工作目录

在 Visual Studio 2015 中设置 TSLint

在 Visual Studio Code 中设置颤振