Jak połączyć wiele zespołów w jeden?


87

Zużywam mój stos usług przy użyciu projektu EXE (zadanie uruchamiania dla aplikacji Azure) w tym, że skopiowałem następujące biblioteki DLL stosu usług i niektóre biblioteki DLL platformy Azure do projektu EXE.

dlls

Kiedy zbuduję ten projekt EXE, biblioteki DLL Azure zostaną dołączone do mojego pliku EXE, ale biblioteka DLL stosu usług nie zostanie dołączona do pliku EXE, ponieważ aby uruchomić plik EXE na dowolnym komputerze, muszę ręcznie skopiować wszystkie biblioteki DLL stosu usług.

Użyłem biblioteki dll tego stosu usług

JsonServiceClient client = new JsonServiceClient(servicepath);

Co powinienem zrobić, aby dołączyć wszystkie te biblioteki DLL do mojego EXE?

Odpowiedzi:


120

Masz kilka możliwości:

LUB

  • użyj narzędzia, takiego jak SmartAssembly (komercyjne),
    które może między innymi osadzać i scalać (nie ma potrzeby zmiany kodu źródłowego)

LUB

  • kod, który sam w mniej niż 10 liniach (bezpłatna, ale minimalna zmiana kodu źródłowego)
    oznacza wszystkie potrzebne zależności jako „zasób osadzony” - w ten sposób są one zawarte w pliku EXE ... musisz skonfigurować program AssemblyResolveobsługi, który w czasie wykonywania odczytuje zasoby z zasobów i zwraca potrzebne biblioteki DLL do środowiska uruchomieniowego .NET ...

4
Dzięki za przypomnienie mi rozwiązania Jeffreya Richtera dotyczącego osadzania złożeń! Zobacz moją odpowiedź, w której wspomina się o Costurze, jako narzędzia, które łączy to z wprowadzaniem niezbędnego kodu.
CodeFox,

29

Narzędzie, którego szukasz, nazywa się ILMerge . Jest to narzędzie wiersza poleceń i można go używać w następujący sposób:

ilmerge /target:winexe /out:MyApp.exe 
        MyExe.exe ServiceStack.dll ServiceStack.Interfaces.dll ServiceStack.ServiceInterface.dll  ServiceStack.Text.dll

Istnieje również artykuł opisujący, jak dołączyć ILMerge do konfiguracji projektu VS tutaj


Cześć, czy mogę dodać zewnętrzny zasób (plik / obraz) do pliku wykonywalnego?
Emdadul Sawon

@EmdadulSawon może możesz uwzględnić je jako zasoby w jednej ze swoich bibliotek?
Alexander,

27

Świetnym narzędziem do dołączania zestawów, do których istnieją odniesienia, jako zasobów osadzonych, jest Costura ( dodatek Fody ). Autor Simon Kropp opisuje to następująco:

[...] połączenie dwóch metod:

Rezultatem jest super proste rozwiązanie, które wymaga jedynie pobrania Costura.Fody z NuGet.

Cechy:

  • W tym symbole debugowania
  • Kompresja osadzonych zespołów
  • Włączanie / wyłączanie określonych zespołów
  • Inne (patrz plik Readme )

9
OMG Costura.Fody to właściwa odpowiedź. Zainstalowałem pakiet z nuget, przebudowałem projekt i teraz mam samodzielny EXE NIESAMOWITY !!
Eric Labashosky

4
Nie mogę uwierzyć, jakie to proste. Po prostu zainstaluj pakiety z nuget i gotowe.
iraSenthil

2
Używam też Costura.Fody. Instalacja pakietów NuGet jako zasobów jest trywialna i bardzo łatwa. Pobierz projekt.
Michael Silver

1
@ user3700562, ta technika nie tworzy nowych zespołów, ale raczej osadza jeden lub więcej zestawów przywoływanych w istniejącym.
CodeFox,

1
Świetne rozwiązanie! Używam go od roku i nie miałem problemu. Ale pamiętaj, że obejmuje tylko zestawy, do których odwołuje się Twój najważniejszy projekt. Jeśli Twoja aplikacja odwołuje się do innego projektu, który odwołuje się do zestawu innej firmy, musisz dodać go do projektu najwyższego poziomu.
Demir,


3

Jeśli masz zależności WPF, opcje mogą być bardziej ograniczone ..... ILMerge nie radzi sobie z nimi. Costura.Fody (jak wspomniał Codefox powyżej) działał jednak idealnie dla nas i zajęło około 5 minut ... bardzo dobre doświadczenie.

Zainstaluj z Nuget (wybierając prawidłowy domyślny projekt w konsoli Menedżera pakietów).

Scala wszystkie biblioteki DLL oznaczone jako „Copy Local” = true i tworzy scalony plik .EXE (obok standardowego wyjścia, którego większość nie jest teraz potrzebna), który również jest kompresowany. Można go następnie używać samodzielnie.

Licencja jest MIT, więc możesz modyfikować / rozpowszechniać zgodnie z wymaganiami.

https://github.com/Fody/Costura/


2

Checkout ServiceStack.Gap projekt, który pokazuje kilka przykładów howto ILMerge ServiceStack w jeden cross-platformowej .exe .

ServiceStack zawiera również szereg innych funkcji, które są szczególnie przydatne w przypadku tworzenia aplikacji osadzonych, w których:

  • Umożliwia samodzielne hostowanie usług przy użyciu odbiornika HTTP .NET
  • Obsługuje wstępnie skompilowane widoki Razor
  • Obsługuje zasoby osadzone
  • Obsługuje osadzoną bazę danych w Sqlite i OrmLite
  • Może być połączona w jeden plik .exe

1

.net core 3 wprowadza dwie nowe opcje w konfiguracji projektu, zwane publikowaniem i przycinaniem pojedynczego pliku.

Więcej informacji na temat dokumentów można znaleźć tutaj , a konfigurację projektu skopiowano tutaj w celach informacyjnych.

  1. Konfiguracja projektu:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. Korzystanie z CLI:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

W pełni obsługiwane jest łączenie dwóch opcji w celu uzyskania przyciętego pojedynczego zespołu do zastosowania.


To nie oznacza, że ​​jesteś jednym montażem. Po prostu kompresuje pliki do archiwum zip, a następnie rozpakowuje je do folderu użytkownika, gdy próbujesz uruchomić aplikację.
Jesper
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.