Как интегрировать ILMerge в процесс сборки Visual Studio для объединения сборок?

Я хочу объединить одну сборку DLL .NET и один проект библиотеки классов C#, на который ссылается a VB.NET проект консольного приложения в один исполняемый файл консоли командной строки.

Я могу сделать это с ILMerge из командной строки, но я хочу интегрировать это слияние ссылочных сборок и проектов в проект Visual Studio. Из моего чтения я понимаю, что могу сделать это через задачу MSBuild или цель и просто добавить ее в C#/VB.Файл NET Project, но я не могу найти конкретный пример, так как MSBuild является большой темой. Кроме того, я нахожу некоторые ссылки, которые добавляют команду ILMerge к событию после сборки.

  1. Как интегрировать ILMerge в Visual Studio (C#/VB.NET) проект, который является только проектами MSBuild, чтобы объединить все ссылочные сборки (copy-local=true) в одну сборку?

  2. Как это связано с возможным ILMerge.Файл целей?

  3. лучше ли использовать Post-build событие?

8 ответов


в "задача MSBuild ILMerge" (или MSBuild.ILMerge.Task) пакет NuGet делает этот процесс довольно простым. По умолчанию он объединяет любые" локальные копии " ссылок в основную сборку.

Примечание: хотя пакеты имеют похожие имена, этот отличается от ILMerge.MSBuild.Tasks что Давид Икарди упомянул в своем ответ. Я предлагаю здесь был впервые опубликован в августе 2014 года.


дополнительная информация, которая может быть полезна для некоторых людей, реализующих решение Скотта Хансельмана.

когда я впервые установил это, он будет жаловаться на невозможность разрешить ссылки на систему.Ядра и т. д. Это связано с поддержкой .NET 4. Включая аргумент / lib, указывающий на каталог .NET 4 Framework, исправляет его (фактически просто включите $(MSBuildBinPath)).

/lib:$(MSBuildBinPath)

затем я обнаружил, что IlMerge бы повесить при слиянии. Он использовал немного процессора и много ОЗУ, но ничего не выводил. Я нашел исправление на stackoverflow конечно.

/targetplatform:v4

Я также обнаружил, что некоторые свойства MSBuild, используемые в статье блога Скотта, полагались на выполнение MsBuild из каталога проекта, поэтому я немного изменил их.

затем я переместил цели и ilmerge.exe в папку tools нашего исходного дерева, которое требовало еще одной небольшой настройки пути...

я, наконец, закончил со следующим Exec элемент для замены одного в оригинальной статье Скотта:

<Exec Command="&quot;$(MSBuildThisFileDirectory)Ilmerge.exe&quot; /lib:$(MSBuildBinPath) /targetplatform:v4 /out:@(MainAssembly) &quot;$(MSBuildProjectDirectory)\@(IntermediateAssembly)&quot; @(IlmergeAssemblies->'&quot;%(FullPath)&quot;', ' ')" /> 

обновление Я также нашел Logic Labs ответ о сохранении поведения CopyLocal и просто исключении ilmerged сборок из CopyLocal essential, если вы используете пакеты Nuget. В противном случае вам нужно указать аргумент /lib для каждого каталога пакетов ссылочных сборок, которые не являются слитый.


вот альтернативное решение:

1) Установите ILMerge.программа MSBuild.Пакет задач от nuget

PM> установить-пакет ILMerge.программа MSBuild.Задачи

2) редактировать *.файл csproj проекта, который вы хотите объединить, добавив код ниже:

  <!-- Code to merge the assemblies into one:setup.exe -->
  <UsingTask TaskName="ILMerge.MSBuild.Tasks.ILMerge" AssemblyFile="$(SolutionDir)\packages\ILMerge.MSBuild.Tasks.1.0.0.3\tools\ILMerge.MSBuild.Tasks.dll" />
  <Target Name="AfterBuild">
    <ItemGroup>
      <MergeAsm Include="$(OutputPath)$(TargetFileName)" />
      <MergeAsm Include="$(OutputPath)LIB1_To_MERGE.dll" />
      <MergeAsm Include="$(OutputPath)LIB2_To_MERGE.dll" />
    </ItemGroup>
    <PropertyGroup>
      <MergedAssembly>$(ProjectDir)$(OutDir)MERGED_ASSEMBLY_NAME.exe</MergedAssembly>
    </PropertyGroup>
    <Message Text="ILMerge @(MergeAsm) -&gt; $(MergedAssembly)" Importance="high" />
    <ILMerge InputAssemblies="@(MergeAsm)" OutputFile="$(MergedAssembly)" TargetKind="SameAsPrimaryAssembly" />
  </Target>

3) Создайте свой проект, как обычно.


статьи смешивание языков в одной сборке в Visual Studio без проблем с ILMerge и MSBuild at http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx демонстрирует использование ILMerge и MSBuild в проекте Visual Studio.


один вопрос, который я нашел со статьей по адресу: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx.

Если у вас есть какие-либо ссылки, которые вы не хотите ILMerge, то код в статье терпит неудачу, потому что он переопределяет поведение CopyLocal по умолчанию, чтобы ничего не делать.

исправить - вместо:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

вместо этого добавьте эту запись в целевой файл (только .NET 3.5) (в отфильтруйте не-ilmerge copylocal файлы, и относиться к ним, как обычно)

<Target Name="AfterResolveReferences">
    <Message Text="Filtering out ilmerge assemblies from ReferenceCopyLocalPaths" Importance="High" />
    <ItemGroup>
        <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.IlMerge)'=='true'" />
    </ItemGroup>
</Target>

Это большая статьи это покажет вам, как объединить ваши ссылочные сборки в выходную сборку. Он точно показывает, как объединить сборки с помощью msbuild.


ознакомьтесь с этой статьей Jomo. У него есть быстрый процесс, чтобы взломать ILMerge в систему msbuild


мои 2 цента - я взял ответ @Jason и заставил его работать для моего решения, где я хотел создать *.exe в папке bin/Debug со всеми *.DLL внутри той же папки.

<Exec Command="&quot;$(SolutionDir)packages\ILMerge.2.13.0307\Ilmerge.exe&quot; /wildcards /out:&quot;$(SolutionDir)..$(TargetFileName)&quot; &quot;$(TargetPath)&quot; $(OutDir)*.dll" /> 

Примечание: это решение, очевидно, жестко закодировано в версию пакета ILMerge nuget. Пожалуйста, дайте мне знать, если у вас есть предложения по улучшению.