Statyczne łączenie bibliotek utworzonych na C#.NET

Używam VS2008 C#.NET.

Stworzyłem 3 różne klasy bibliotek w 3 projektach. Napisałem aplikację, która korzysta z tych bibliotek (DLL).

Dzieje się tak, że każdy projekt jest kompilowany do biblioteki klas. Mam 3 dlls i 1 exe.

Zamiast tego chcę mieć je na dwa sposoby:

  1. Only class library assembly (dll), który zawiera 3 z nich i 1 exe.
  2. just one EXE (everything in it):: static linking.

Jak mogę to zrobić? Nie mogę znaleźć żadnych opcji dla statycznego łączenia w VS2008 również proszę wspomnieć o opcjach linii poleceń.

Author: claws, 2009-12-08

5 answers

ILMerge jest tym, czego szukasz.

Nie jestem pewien, czy naprawdę nazwałbym to "statyczne łączenie" - to po prostu łączenie kilku zespołów w jeden. (W szczególności, proszę nie odnieść wrażenia, że jest to budowanie natywnego, niezarządzanego pliku wykonywalnego.) Jednak myślę, że o to ci chodzi :)

Aktualizacja : ILMerge jest teraz open source i jest również dostępny jako pakiet NuGet :

Install-Package ilmerge 
 41
Author: Jon Skeet,
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-15 09:23:17

Możesz umieścić cały kod w jednym projekcie EXE, użyć linkera innej firmy (google . NET static linker dla wielu opcji) lub użyć ILMerge jako zilustrowanego tutaj.

Zewnętrzne łączniki zazwyczaj oferują również zaciemnianie kodu, a niektóre mogą również statycznie łączyć. NET Framework.

 10
Author: Eric J.,
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
2009-12-08 17:19:11

Natknąłem się na to pytanie i znalazłem inną metodę osiągnięcia tych celów od Jeffreya Richtera (http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx): możesz osadzić swoje .dll do pliku wykonywalnego jako zasobu, a następnie przeciążenie zdarzenia AssemblyResolve w celu załadowania złożenia w ten sposób. Cytując kod z linku:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
   String resourceName = "AssemblyLoadingAndReflection." +
      new AssemblyName(args.Name).Name + ".dll";
   using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
      Byte[] assemblyData = new Byte[stream.Length];
      stream.Read(assemblyData, 0, assemblyData.Length);
      return Assembly.Load(assemblyData);
   }
};
 5
Author: Aidan Cully,
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
2015-10-01 20:10:32

W odniesieniu do odpowiedzi Jona Skeeta , ILRepack jest również dobrą open-source alternatywą dla ILMerge. Możesz go zainstalować z NuGet poprzez:

Install-Package ILRepack
 4
Author: James Ko,
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:25:51

Powinieneś również spojrzeć na ILMERGE-GUI . To opakowanie graficzne dla ILMerge.

 2
Author: Paul Hutchinson,
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-10-24 16:19:56