Jak zintegrować ILMerge z procesem tworzenia Visual Studio, aby scalić zespoły?

Chcę połączyć jeden zespół DLL. NET i jeden projekt biblioteki klas C#, do którego odwołuje się VB.NET projekt aplikacji konsolowej w jeden plik wykonywalny konsoli wiersza poleceń.

Mogę to zrobić z ILMerge z wiersza poleceń, ale chcę zintegrować to łączenie zestawów referencyjnych i projektów w projekcie Visual Studio. Z lektury rozumiem, że mogę to zrobić poprzez zadanie MSBuild lub cel i po prostu dodać go do pliku projektu C#/VB.NET, ale nie mogę znaleźć żadnego konkretnego przykład ponieważ MSBuild jest dużym tematem. Co więcej, znajduję pewne odniesienia, które dodają polecenie ILMerge do zdarzenia Post-build.

  1. Jak zintegrować ILMerge z projektem Visual Studio (C# / VB. NET), które są tylko projektami MSBuild, aby scalić wszystkie odwołane zespoły (copy-local=true) w jeden zespół?

  2. Jak to ma związek z potencjalnym ILMerge.Akta celów?

  3. Czy lepiej jest użyć zdarzenia Post-build?

Author: AMissico, 2010-03-31

8 answers

" MSBuild ILMerge task " (lub MSBuild.ILMerge.Task) pakiet NuGet sprawia, że proces ten jest dość prosty. Domyślnie łączy wszelkie odniesienia "copy local"do głównego zestawu.

Uwaga: chociaż pakiety mają podobne nazwy, ten różni się od ILMerge.MSBuild.Tasks, o którym wspomniał Davide Icardi w swojej odpowiedzi . Ten, który sugeruję, został po raz pierwszy opublikowany w sierpniu 2014.

 52
Author: Holistic Developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:27

Kilka informacji, które mogą być przydatne dla niektórych osób wdrażających rozwiązanie Scotta Hanselmana .

Kiedy po raz pierwszy skonfigurowałem to, narzekało, że nie jest w stanie rozwiązać odniesień do systemu.Rdzeń itp. Jest to coś wspólnego z obsługą. NET 4. Dodanie argumentu / lib wskazującego na katalog. NET 4 Framework naprawia to (w rzeczywistości wystarczy podać $(MSBuildBinPath)).

/lib:$(MSBuildBinPath)

Potem odkryłem, że IlMerge zawiśnie podczas łączenia. To było za pomocą trochę CPU i dużo pamięci RAM, ale nic nie wyprowadzał. Znalazłem poprawkę na stackoverflow oczywiście .

/targetplatform:v4

Odkryłem również, że niektóre właściwości MSBuild użyte w artykule Scotta na blogu polegały na wykonaniu MsBuild z katalogu projektu, więc trochę je poprawiłem.

Potem przesunąłem cele i ilmerge.exe do folderu tools w naszym drzewie źródłowym, który wymagał kolejnego małego poprawki do ścieżek...

W końcu skończyłem z następującymi Exec element zastępujący ten w oryginalnym artykule Scotta:

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

Aktualizacja Znalazłem również odpowiedź laboratoria logiczne na temat zachowania CopyLocal i wyłączenia zespołów ilMerged z CopyLocal essential, jeśli używasz pakietów Nuget. W przeciwnym razie musisz podać argument /lib dla każdego katalogu pakietów odwołanych zestawów, które nie są scalane.

 18
Author: Jason Duffett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:59

Tutaj alternatywne rozwiązanie:

1) Zainstaluj ILMerge.MSBuild.Pakiet zadań z nuget

PM> Install-Package ILMerge.MSBuild.Zadania

2) edytuj*.plik csproj projektu, który chcesz scalić, dodając poniższy kod:

  <!-- 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) Zbuduj swój projekt jak zwykle.

 17
Author: Davide Icardi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-19 00:08:44

Artykuł mieszanie języków w jednym montażu w Visual Studio bezproblemowo z ILMerge i MSBuild w http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx pokazuje jak używać ILMerge i MSBuild w projekcie Visual Studio.

 15
Author: AMissico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-31 20:43:19

Jeden numer znalazłem w artykule: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx.

Jeśli masz jakieś odniesienia, których nie chcesz ILMerge, kod w artykule nie powiedzie się, ponieważ nadpisuje domyślne zachowanie CopyLocal, aby nic nie robić.

Aby to naprawić-zamiast:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

Dodaj ten wpis do pliku docelowego (tylko. NET 3.5) (aby odfiltrować nie-ilmerge pliki copylocal i traktować je jako normalne)

<Target Name="AfterResolveReferences">
    <Message Text="Filtering out ilmerge assemblies from ReferenceCopyLocalPaths" Importance="High" />
    <ItemGroup>
        <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.IlMerge)'=='true'" />
    </ItemGroup>
</Target>
 8
Author: Logic Labs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-07 20:40:14

Jest to świetny artykuł , który pokaże Ci, jak scalić odwołane Zespoły do wyjściowego zestawu. Pokazuje dokładnie, jak scalić zespoły za pomocą msbuild.

 4
Author: Rohan West,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-22 12:29:53

Zobacz ten artykuł Jomo. Ma szybki proces włamania ILMerge do systemu msbuild

 0
Author: JaredPar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-31 20:46:31

Moje 2 centy-odebrałem odpowiedź @ Jason i sprawiłem, że działa dla mojego rozwiązania, w którym chciałem wygenerować *.exe w folderze bin/Debug z all *.biblioteki DLL w tym samym folderze.

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

Uwaga: To rozwiązanie jest oczywiście zakodowane na twardo w wersji pakietu ILMerge nuget. Daj mi znać, jeśli masz jakieś sugestie do poprawy.

 0
Author: rui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-13 18:46:36