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

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

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

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

【问题讨论】:

    标签: c# .net visual-studio msbuild large-address-aware


    【解决方案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 起不再工作(请参阅stackoverflow.com/questions/42805662/…)。我最终不得不使用 $(VS140COMNTOOLS)
    【解决方案2】:

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

    editbin /largeaddressaware $(TargetPath)
    

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

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

    【讨论】:

    • 这很好用,但如果您使用 ClickOnce 发布,请注意它使用 obj 文件夹中的文件而不是 @ 中的文件发布987654324@。要涵盖正常的构建输出(用于调试/本地运行)以及 ClickOnce 发布,您需要在 Post Build 事件中针对 both 目录运行 editbin。我还建议将 TargetPath 宏用引号括起来。
    • 请务必查看 Kirill 的回答。他的 nuget 包非常有帮助。 stackoverflow.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 下执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 2021-01-22
      • 2019-06-05
      • 2020-02-28
      • 2011-10-04
      • 1970-01-01
      相关资源
      最近更新 更多