我正在使用NuGet包MSBuild.ILMerge.Task
将.NET外部dll组合到一个可执行文件中。它就像一个魅力。
现在,当我尝试在调试时编辑时,Visual Studio说:
如果尚未加载程序集,则不允许进行更改
我认为将所有依赖关系整合到单个.exe中是不利的(我不知道这个,它只是猜测)。
但无论如何,在Build上使用MSBuild.ILMerge.Task
是有意义的,但在Debug上是不活动的。有人知道如何实现这个目标吗?
请注意,当通过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"
以及一种在调试时禁用的方法,而且我发现this post似乎可以解释如何。
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')" />
这是一些东西,但它看起来有点手工制作,暂时不切实际......
答案 0 :(得分:9)
您可以选择仅为&#34;发布&#34;运行ILMerge构建,并将其从&#34; Debug&#34;构建,在这种情况下,您可以像在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')" />
为:
<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工具栏中的“调试/发布”下拉菜单在构建配置之间切换。或者,或者,打开Build&gt; Configuration Manager并更改&#34; Active解决方案配置&#34;。