我该如何暂时停用MSBuild.ILMerge.Task?

Xav*_*eña 3 c# msbuild ilmerge msbuild-task

我正在使用NuGet包MSBuild.ILMerge.Task将.NET外部dll组合到一个可执行文件中.它就像一个魅力.

现在,当我尝试在调试时进行编辑时,Visual Studio说:

如果尚未加载程序集,则不允许进行更改

我想这是将所有依赖项都放入单个.exe中的缺点(我不知道,这只是猜测).

但无论如何,MSBuild.ILMerge.Task在Build 上使用它是有意义的,但在Debug上是不活动的.有谁知道如何实现这一目标?

请注意,当MSBuild.ILMerge.Task通过NuGet安装时,当您点击"rebuild"时,它会自动创建单个.exe(当然,将.config文件放在外面,加上.pdb).您不需要配置任何东西,这就是为什么我无法猜测流程的内部工作原理以及如何将其取消激活.


有关更多信息,我正在写一篇关于ILMerge的博客文章.我想记录所有的方法,问题和警告:

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


Edit1:我注意到NuGet包会自动设置一个.props包含以下信息的文件:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Run Code Online (Sandbox Code Playgroud)

我已经开始寻找DefaultTargets="Build"和禁用调试的方法,我发现这篇文章似乎解释了如何.


EDIT2:

如果从我的.csproj中删除这一行,那么它会正确跳过ILMerge编译:

<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')" />  
Run Code Online (Sandbox Code Playgroud)

这是什么,但它看起来有点手工制作,目前还不切实际......

小智 11

您可以选择仅针对"Release"构建运行ILMerge,并将其从"Debug"构建中删除,在这种情况下,您可以像在Debug构建中一样使用调试器,但只有在准备好时才更改为Release将程序集合并为单个可执行文件.

您可以通过编辑.csproj文件并更改此行来执行此操作:

<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')" />
Run Code Online (Sandbox Code Playgroud)

至:

<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')" />
Run Code Online (Sandbox Code Playgroud)

插入'$(Configuration)'=='Release' AND到Condition属性的区别.

使用Visual Studio工具栏中的"调试/发布"下拉菜单在构建配置之间切换.或者,打开Build> Configuration Manager并更改"Active solution configuration".

  • 对Nuget包非常有用!只有在nuget打包时,才能将调试配置用于所有开发和发布.运行单元测试时,我遇到了一个令人讨厌的构建错误,这个条件功能节省了我的一天. (2认同)