gpt4 book ai didi

c# - 如何暂时停用 MSBuild.ILMerge.Task?

转载 作者:行者123 更新时间:2023-11-30 13:30:08 24 4
gpt4 key购买 nike

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

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

Changes are not allowed if the assembly has not been loaded

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

但无论如何,MSBuild.ILMerge.Task 在 Build 上运行但在 Debug 上处于非事件状态是有意义的。有谁知道如何实现这一点?

请注意,当通过 NuGet 安装 MSBuild.ILMerge.Task 时,当您点击“重建”时,它会自动创建单个 .exe(当然,让 .config 文件外加一个 .数据库)。您不需要配置任何东西,这就是为什么我无法猜测进程的内部工作原理以及如何将其停用的原因。


有关更多信息,我正在撰写有关 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">

我已经开始寻找 DefaultTargets="Build" 和一种在调试时禁用的方法,我找到了 this post这似乎解释了如何。


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

有点东西,但目前看起来有点手工制作而且不切实际......

最佳答案

您可以选择仅针对“发布”构建运行 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 工具栏中的调试/发布下拉菜单在构建配置之间切换。或者,也可以打开 Build > Configuration Manager 并更改“Active solution configuration”。

关于c# - 如何暂时停用 MSBuild.ILMerge.Task?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40133651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com