如何暂时禁用MSBuild.ILMerge.Task?

5
我正在使用NuGet包MSBuild.ILMerge.Task,将.NET外部dll组合成一个单独的可执行文件。它非常好用。
现在,当我尝试在调试时进行编辑时,Visual Studio会显示以下内容:

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

我想这可能是将所有依赖项放入单个.exe文件的缺点(我不确定,这只是一个猜测)。
但无论如何,在构建时激活MSBuild.ILMerge.Task,在调试时禁用它是有意义的。有人知道如何实现吗?
请注意,当通过NuGet安装MSBuild.ILMerge.Task时,当您点击“重新生成”时,它会自动创建单个.exe文件(当然,让.config文件位于外部,还有.pdb)。您不需要配置任何内容,这就是为什么我无法猜测该过程的内部工作原理以及如何禁用它。
有关更多信息,我正在撰写一篇关于ILMerge的博客文章。我正在尝试记录所有的操作方法、问题和注意事项:

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


编辑1:我注意到NuGet包自动设置了一个.props文件,其中包含以下信息:

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

我已经开始寻找DefaultTargets =“Build”以及在调试时禁用的方法,并且我发现这篇文章似乎解释了如何操作。


编辑2:

如果从我的.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')" />  

这个东西有点意思,但目前看起来有些手工制作,并且不太实用...

1个回答

16

您可以选择仅在“发布”构建时运行ILMerge,并将其从“调试”构建中排除。在这种情况下,您可以像在调试构建中一样使用调试器,但仅当您准备将程序集合并为单个可执行文件时才切换到发布模式。

您可以通过编辑.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')" />

收件人:

<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')" />

区别在于将 '$(Configuration)'=='Release' AND 插入到 Condition 属性中。

使用 Visual Studio 工具栏中的 Debug / Release 下拉菜单在不同构建配置之间进行切换。或者,打开“生成” > “配置管理器”,并更改“活动解决方案配置”。


2
非常适用于Nuget包!您可以在所有开发中使用调试配置,仅在nuget打包时使用发布。当运行单元测试时,我遇到了一个讨厌的构建错误,而这个条件功能则拯救了我的一天。 - Alberto Chiesa
这是合并 ClassLib 项目 A 及其依赖项(供其他解决方案使用),并在同一解决方案中运行以 A 为项目引用的项目 B 的唯一方法。 - Florian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接