2 votes

Comment puis-je désactiver temporairement MSBuild.ILMerge.Task ?

J'utilise le paquet NuGet MSBuild.ILMerge.Task afin de combiner les dlls externes .NET en un seul fichier exécutable. Cela fonctionne à merveille.

Maintenant, quand j'essaie d'éditer pendant le débogage, Visual Studio dit :

Les modifications ne sont pas autorisées si l'assemblage n'a pas été chargé.

Je suppose que c'est l'inconvénient d'avoir toutes les dépendances dans un seul .exe (je n'en suis pas sûr, c'est juste une supposition).

Mais de toute façon, il serait logique d'avoir MSBuild.ILMerge.Task sur Build, mais inactif sur Debug. Quelqu'un sait-il comment réaliser cela ?

Notez que lorsque MSBuild.ILMerge.Task est installé via NuGet, lorsque vous cliquez sur "rebuild", il crée automatiquement l'unique .exe (en laissant le fichier .config à l'extérieur, bien sûr, plus un .pdb). Vous n'avez pas besoin de configurer quoi que ce soit, et c'est pourquoi je ne suis pas en mesure de deviner le fonctionnement interne du processus et comment le désactiver.


Pour plus d'informations, je suis en train d'écrire un billet de blog sur ILMerge. J'essaie de documenter tous les modes d'emploi, les problèmes et les avertissements :

http://localcode.wikidot.com/merge-all-binary-files-dll-s-etc-into-a-single-exe


Edit1 : J'ai remarqué que le paquet NuGet définit automatiquement un fichier .props avec les informations suivantes :

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

J'ai commencé à chercher DefaultTargets="Build" et un moyen de le désactiver sur le débogage, et j'ai trouvé ce poste qui semble expliquer comment.


Edit2 :

Si j'enlève ces lignes de mon .csproj, alors la compilation d'ILMerge s'effectue correctement :

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
  <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.props'))" />
<Error Condition="!Exists('..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets'))" />
</Target>
<Import Project="..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets" Condition="Exists('..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets')" />  

C'est quelque chose, mais ça a l'air un peu artisanal et peu pratique pour le moment...

9voto

Jeff P Points 533

Vous pouvez choisir d'exécuter ILMerge uniquement pour les constructions "Release", et de ne pas l'utiliser pour les constructions "Debug", dans ce cas vous pouvez utiliser le débogueur comme vous le feriez normalement dans les constructions Debug, mais passer à Release seulement lorsque vous êtes prêt à fusionner vos assemblages en un seul exécutable.

Vous pouvez le faire en modifiant votre fichier .csproj et en changeant cette ligne :

<Import
  Project="..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets"
  Condition="Exists('..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets')" />

à :

<Import
  Project="..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets" 
  Condition="'$(Configuration)'=='Release' AND Exists('..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets')" />

la différence étant d'insérer le '$(Configuration)'=='Release' AND à l'attribut Condition.

Utilisez le menu déroulant Debug / Release dans votre barre d'outils Visual Studio pour basculer entre les configurations de construction. Ou, alternativement, ouvrez Build > Configuration Manager et modifiez la "Configuration active de la solution".

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