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


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

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

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

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

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

8 65

8 ответов:

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

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

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

когда я впервые установил это, он будет жаловаться на то, что не может разрешить ссылки на систему.Сердечник, etc. Это что-то делать с поддержкой .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;', ' ')" /> 

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

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

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

PM> Install-Package 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) (to отфильтруйте не-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.

проверьте эту статью Джомо. У него есть быстрый процесс, чтобы взломать 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. Пожалуйста, дайте мне знать, если у вас есть предложения по улучшению.