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

Mic*_*tum 63 .net c# msbuild visual-studio

我有一个.net程序集需要32位,需要/ LARGEADDRESSAWARE.

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

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

Mic*_*ael 97

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

call "$(VS100COMNTOOLS)..\tools\vsvars32.bat"
editbin /largeaddressaware $(TargetPath)
Run Code Online (Sandbox Code Playgroud)

另一件需要理解的是,如果在项目属性的Debug选项卡下选中了Enable the Visual Studio hosting process复选框(默认),则应用程序将无法使用LARGEADDRESSAWARE运行(因为vshost.exe未正确标​​记).取消选中该框以使用LARGEADDRESSAWARE调试您的应用程序.

  • 对于VS 2013,您需要将第一行更改为"call"$(DevEnvDir)..\tools\vsvars32.bat"` (20认同)
  • 不要忘记将`$(TargetPath)`包装在引号`"$(TargetPath)"中 (12认同)
  • 对于那些使用VS 2012的人来说,第一行是"call"$(VS110COMNTOOLS)..\tools\vsvars32.bat"` (11认同)
  • 快速更新 - 由于路径的变化,DevEnvDir不再适用于VS2017(请参阅/sf/ask/2996396371/).我不得不最终使用$(VS140COMNTOOLS) (4认同)

Yi *_*hao 49

您可以将其作为构建后任务执行.在"构建事件"选项卡中,输入以下命令

editbin /largeaddressaware $(TargetPath)
Run Code Online (Sandbox Code Playgroud)

进入"后期构建事件命令行:"

这是VS2008的情况.我认为VS2010应该以同样的方式工作.

  • 这很好用,但如果你使用ClickOnce发布,请注意它使用**`obj`**文件夹中的文件而不是**`bin`**中的文件发布.要覆盖正常构建输出(用于本地调试/运行)以及ClickOnce发布,您需要在Post Build事件中对**两个**目录运行`editbin`.我还建议在引号中包装`TargetPath`宏. (7认同)

Kir*_*kov 14

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

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

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

__CODE__

  • 尽管需要手动编辑项目文件,但“ *”非常简单。至少您不必处理环境变量,也不必尝试安装所有版本的VC ++构建工具的正确版本。我确实建议将<LargeAddressAware>标签放在x86平台上有条件的<PropertyGroup>中。 (2认同)
  • @rolls 只是 exe (2认同)

小智 5

如果你编译你的程序集:

<PlatformTarget>AnyCPU</PlatformTarget>
<Prefer32Bit>true</Prefer32Bit> <!--Default !false!-->
Run Code Online (Sandbox Code Playgroud)

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

使用 VS 2019 测试(需要 Visual Studio 2015+,根据为什么“任何 CPU(首选 32 位)”允许我在 .NET 4.5 下分配比 x86 更多的内存?)。

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