2016-10-19 6 views
0

Я использую пакет NuGet MSBuild.ILMerge.Task, чтобы объединить внешние DLL .NET с одним исполняемым файлом. Отлично работает.Как временно отключить MSBuild.ILMerge.Task?

Теперь, когда я пытаюсь изменить во время отладки, Visual Studio говорит:

Изменения не допускаются, если сборка не была загружена

Я предполагаю, что это оборотная сторона того, все зависимостей в один .exe (я не знаю об этом, это просто предположение).

Но в любом случае было бы целесообразно иметь MSBuild.ILMerge.Task на сборке, но неактивно на отладке. Кто-нибудь знает, как добиться этого?

Обратите внимание, что когда 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"> 

Я начал искать 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')" /> 

Это что-то, но это выглядит немного ручной работы и непрактично на данный момент ...

ответ

4

Вы можете выбрать запуск ILMerge только для сборки «Release» и оставить его вне сборки «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')" /> 

к:

<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.

Используйте раскрывающееся меню Debug/Release на панели инструментов Visual Studio для переключения между конфигурациями компоновки. Или, альтернативно, откройте «Сборка»> «Диспетчер конфигурации» и измените «Конфигурация активного решения».

+1

Невероятно полезно для пакетов Nuget! Вы можете использовать конфигурацию отладки для всех разработок и выпуска только при сборе пакетов nuget. У меня была неприятная ошибка сборки при запуске модульных тестов, и эта функция состояния сохранила мой день. –