68 votes

Puis-je définir LARGEADDRESSAWARE à partir de Visual Studio ?

J'ai un assemblage .net qui doit être 32 bits et doit être /LARGEADDRESSAWARE.

Je sais comment le faire avec EditBin, mais je me demande s'il existe un moyen intégré dans Visual Studio 2010 ? Ou bien, quelqu'un a-t-il écrit une tâche MSBuild pour cela ?

Editar: C'est pour une application C#, donc pas d'options de linker malheureusement :(

99voto

Michael Points 1649

Dans le prolongement de la réponse de @RouMao, vous pouvez obtenir un message d'erreur indiquant que editbin ne peut être trouvé. Assurez-vous que l'environnement dans la ligne de commande de l'événement post-construction est correctement configuré en spécifiant ce qui suit :

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

Une autre chose à comprendre est que votre LARGEADDRESSAWARE ne s'exécutera pas en mode débogage lorsque (sous l'onglet Debug dans les propriétés de votre projet) le Enable the Visual Studio hosting process est cochée (ce qui est le cas par défaut), parce que l'option vshost.exe n'est pas correctement signalée.

Décochez cette case pour déboguer votre application à l'aide de LARGEADDRESSAWARE .

20 votes

Pour VS 2013, vous devez changer la première ligne en call "$(DevEnvDir)..\tools\vsvars32.bat"

11 votes

Et pour ceux qui travaillent avec VS 2012 la première ligne est call "$(VS110COMNTOOLS)..\tools\vsvars32.bat"

13 votes

N'oubliez pas d'emballer votre $(TargetPath) entre guillemets "$(TargetPath)"

50voto

RouMao Points 4258

Vous pouvez le faire en tant que tâche post-construction. Dans l'onglet "Build Events", mettez la commande suivante

editbin /largeaddressaware $(TargetPath)

dans la "ligne de commande de l'événement post-construction".

C'est le cas pour VS2008. Je pense que cela devrait fonctionner de la même manière pour VS2010.

7 votes

Cela fonctionne très bien, mais si vous utilisez ClickOnce pour publier, sachez qu'il publie en utilisant les fichiers dans le répertoire obj et NON ceux qui se trouvent dans le dossier bin . Pour couvrir à la fois le résultat normal de la construction (utilisé pour le débogage / l'exécution locale) et les publications ClickOnce, vous devez exécuter editbin contre les deux dans l'événement Post Build. Je suggère également d'envelopper l'événement TargetPath macro entre guillemets.

0 votes

Ne manquez pas de consulter la réponse de Kirill. Son paquet nuget est très utile. stackoverflow.com/a/45182578/55721

24voto

Kirill Osenkov Points 3902

Il s'agit d'un paquet NuGet qui permet de définir LargeAddressAware sur votre binaire après sa construction : https://github.com/KirillOsenkov/LargeAddressAware

Il ne nécessite pas editbin.exe car il dispose d'une application gérée pour définir le drapeau de manière programmatique : https://github.com/KirillOsenkov/LargeAddressAware/blob/master/SetLargeAddressAware/LargeAddressAware.cs

Mise à jour : Pour l'utiliser, il suffit d'installer le paquet et d'ajouter cette propriété dans votre .csproj :

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

10voto

Dmitriy Ivanov Points 470

Si vous compilez votre Assemblée avec :

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

que votre assemblage résultant recevra automatiquement LARGE ADDRESS AWARE drapeau.

Testé avec VS 2019 (nécessite Visual Studio 2015+, conformément à l'accord de l'UE) Pourquoi l'option "Any CPU (prefer 32-bit)" me permet-elle d'allouer plus de mémoire que l'option x86 sous .NET 4.5 ? ).

Vous n'avez donc pas besoin d'actions spéciales dans la plupart des cas. Votre assemblage AnyCPU sera exécuté sous x86 + LAA par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X