2010-03-31 13 views
61

Chcę scalić jeden zestaw .NET DLL i jeden projekt biblioteki klas C#, do którego odwołuje się projekt aplikacji konsoli VB.NET w jeden plik wykonywalny konsoli wiersza polecenia.Jak zintegrować ILMerge z procesem tworzenia Visual Studio w celu scalenia złożeń?

Mogę to zrobić z ILMerge z wiersza poleceń, ale chcę zintegrować to scalanie zestawów referencyjnych i projektów z projektem Visual Studio. Z mojego czytania rozumiem, że mogę to zrobić poprzez zadanie MSBuild lub Target i po prostu dodać je do pliku projektu C#/VB.NET, ale nie mogę znaleźć żadnego konkretnego przykładu, ponieważ MSBuild to duży temat. Ponadto znajduję niektóre odwołania, które dodają polecenie ILMerge do zdarzenia po instalacji.

  1. Jak zintegrować ILMerge w Visual Studio (C#/VB.NET) projektów, które są tylko projekty MSBuild, aby scalić wszystkie zespoły odwołuje (copy-local = true) w jednym zespole?

  2. W jaki sposób wiąże się z możliwym plikiem ILMerge.Targets?

  3. Czy lepiej jest korzystać z wydarzenia typu Post-build?

+0

Można również użyć "post zbudować ciąg" do zrobienia, że ​​jak wspomniano [tutaj] [1] [1]: http://stackoverflow.com/questions/2961357/using-ilmerge -with-net-4-libraries/5408079 # 5408079 –

Odpowiedz

0

Sprawdź ten artykuł Jomo. Ma szybki proces hack ILMerge do systemu msbuild

+1

Artykuł Łączenie języków w pojedynczym złożeniu w Visual Studio bezproblemowo z ILMerge i MSBuild pod adresem http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeilelyWithILMergeAndMSBuild.aspx jest oparty na jego blogu i udoskonala technikę aby umożliwić selektywne scalanie poprzez ustawienie ILMerge = True/False w pliku projektu. Artykuł jest znacznie bardziej szczegółowy niż wpis blogu Jomo. – AMissico

4

To wielki article, który pokaże Ci, jak scalić odwołuje zespoły do ​​zespołu wyjściowego. Pokazuje dokładnie, jak scalić złoenia za pomocą msbuild.

+1

Łatwo przeoczyć jego zaktualizowany i bardziej szczegółowy wpis na blogu, więc powrócę do niego tutaj http://www.clariusconsulting.net/blogs/kzu/archive/2009/02/23/LeveragingILMergetosimplifydeploymentandyourusersexperience.aspx. – AMissico

+0

Wymieniony artykuł jest bardziej aktualny, ale mniej szczegółowy, zawiera kilka interesujących komentarzy. –

+3

Oba łącza są martwe – WernerCD

8

Jeden numer, który znalazłem w artykule pod adresem: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx.

Jeśli masz jakieś odniesienia, których nie chcesz ILMerge, kod w artykule nie działa, ponieważ zastępuje domyślne zachowanie CopyLocal, aby nic nie robić.

Aby rozwiązać ten problem - zamiast:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

Dodaj ten wpis do celów pliku zamiast (.NET 3.5 only) (odfiltrować non-ILMerge plików 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> 
+1

O tak! Jest to koniecznie konieczne, jeśli używasz Nuget, w przeciwnym razie musisz określić folder zawartości pakietu dla każdego zestawu referencyjnego, którego nie łączysz. Dziękuję Ci! –

17

Niektóre więcej informacji, które mogą być przydatne do realizacji Scott Hanselman's solution niektórzy ludzie.

Po pierwszym ustawieniu narzekałbym na brak możliwości odniesienia się do System.Core, itp. To jest coś wspólnego z obsługą .NET 4. Dołączenie argumentu/lib wskazującego katalog .NET 4 Framework naprawia go (w rzeczywistości po prostu dołączamy $ (MSBuildBinPath)).

/lib:$(MSBuildBinPath)

I wtedy okazało się, że ILMerge zawiśnie podczas scalania.Używał trochę procesora i dużo pamięci RAM, ale niczego nie wysyłał. Znalazłem poprawkę on stackoverflow of course.

/targetplatform:v4

ja również, że niektóre właściwości MSBuild stosowanych w blogu Scotta artykułu oparł się na wykonywanie msbuild z katalogu projektu, więc manipulowane im trochę.

Potem przeniósł celów & ilmerge.exe do folderu Narzędzia naszego drzewa źródłowego, który wymagał inny mały dopracowujemy ścieżkach ...

I w końcu skończyło się z poniższym Exec elementu do zastąpienia jeden z oryginalnego artykułu Scotta:

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

UPDATE Znalazłem również Logic Labs answer o utrzymanie CopyLocal zachowanie i po prostu wyłączając ilMerged zespołów z Cop yLocal essential, jeśli używasz pakietów Nuget. W przeciwnym razie musisz określić argument/lib dla każdego katalogu pakietów odwoływanych złożeń, które nie są scalane.

+0

W rzeczywistości otrzymałem plik ILMerge.exe, dodając go do kontroli kodu źródłowego i wpisując niektóre polecenia do zdarzenia po kompilacji. – Haobo

15

Tutaj alternatywne rozwiązanie:

1) Zainstaluj pakiet ILMerge.MSBuild.Tasks z Nuget

PM> Install-Package ILMerge.MSBuild.Tasks

2) edytować * 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.

+0

To naprawdę kiepski pakiet, który nie jest lepiej utrzymywany. Używałem go, ale brakuje mu możliwości ustawienia TargetPlatform, która ma duże znaczenie dla .NET 4.5/.NET 4.0 compat. –

+0

@davidlcardi jak zastąpić nazwę pliku docelowego, dll_to_merge itp. – Smith

+0

@Smith TargetFileName jest już zmienną msbuild, więc nie trzeba jej wymieniać. LIB1_To_Merge.dll są ustalonymi nazwami. Prawdopodobnie przy niektórych bardziej złożonych skryptach msbuild można znaleźć wszystkie odwołania do złożeń, ale nie wiem jak to zrobić. –

46

przycisków „MSBuild ILMerge task” (lub MSBuild.ILMerge.Task) pakietu Nuget czyni ten proces bardzo proste. Domyślnie jest to połączenie wszystkich odwołań "skopiuj lokalne" do głównego zespołu.

Uwaga: Chociaż pakiety mają podobne nazwy, ten jest różny od ILMerge.MSBuild.Tasks że Davide Icardi wspomniano w jego answer. Ta, którą tu sugeruję, została po raz pierwszy opublikowana w sierpniu 2014 roku.

+3

Rozwiązanie, które powinno być! +1 –

+1

To powinno być akceptowane rozwiązanie. Sprawia, że ​​jest naprawdę bezbolesny. Dziękuję Ci! –

+0

Fajna: D Nie idealne, ponieważ "zapomniałem" włączyć dodatkowe pliki do katalogu wyjściowego, ale nadal dobrze^^ – Ethenyl

0

Moje 2 centy - Podjąłem odpowiedź @ Jason'a i sprawiłem, że zadziałało dla mojego rozwiązania, gdzie chciałem wygenerować * .exe w folderze bin/Debug ze wszystkimi * .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 stałe w wersji pakietu ILMerge nuget. Daj mi znać, jeśli masz jakieś sugestie, które warto poprawić.

Powiązane problemy