Как интегрировать ILMerge в процесс сборки Visual Studio для объединения сборок? - PullRequest
69 голосов
/ 31 марта 2010

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

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

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

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

  3. Лучше ли использовать событие после сборки?

Ответы [ 8 ]

53 голосов
/ 13 октября 2014

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

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

18 голосов
/ 19 ноября 2012

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

1) Установить пакет ILMerge.MSBuild.Tasks из nuget

PM> Инсталляционный пакет ILMerge.MSBuild.Tasks

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) Создайте свой проект как обычно.

18 голосов
/ 10 мая 2012

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

Когда я впервые настроил это, он жаловался на невозможность разрешить ссылки на System.Core и т. Д. Это как-то связано с поддержкой .NET 4. Исправляет это включение аргумента / lib, указывающего на каталог .NET 4 Framework (на самом деле это просто $ (MSBuildBinPath)).

/lib:$(MSBuildBinPath)

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

/targetplatform:v4

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

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

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

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

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

15 голосов
/ 01 апреля 2010

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

8 голосов
/ 08 марта 2012

Одна проблема, которую я нашел со статьей по адресу: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx.

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

Чтобы это исправить - вместо:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

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

<Target Name="AfterResolveReferences">
    <Message Text="Filtering out ilmerge assemblies from ReferenceCopyLocalPaths" Importance="High" />
    <ItemGroup>
        <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.IlMerge)'=='true'" />
    </ItemGroup>
</Target>
4 голосов
/ 01 апреля 2010

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

1 голос
/ 13 ноября 2014

Мои 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" /> 

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

0 голосов
/ 01 апреля 2010

Проверьте эту статью Джомо. У него есть быстрый процесс взлома ILMerge в систему msbuild

...