Подтвердить что ты не робот

Статическая связь библиотек, созданных на С#.NET.

Я использую VS2008 С#.NET.

Я создал 3 разных класса библиотек в 3 проектах. Я написал приложение, которое использует эти библиотеки (dll).

Что происходит, каждый проект компилируется в библиотеку классов. Итак, у меня 3 dll и 1 exe.

Вместо этого я хочу иметь их двумя способами:

  • Только сборка библиотеки классов (dll), которая содержит 3 из них и 1 exe.
  • только один EXE (все внутри него):: статическая привязка.

Как я мог это сделать? Я не могу найти какие-либо опции для статической привязки в VS2008, пожалуйста, также укажите параметры командной строки.

4b9b3361

Ответ 1

ILMerge - это то, что вам нужно.

Я не уверен, что действительно назвал бы это "статическое связывание" - это просто слияние нескольких сборок в один. (В частности, не создается впечатление, что это создает собственный, неуправляемый исполняемый файл.) Однако, я думаю, это то, что вам нужно:)

Обновление: ILMerge теперь с открытым исходным кодом и также доступен как пакет NuGet:

Install-Package ilmerge 

Ответ 2

Вы можете поместить весь свой код в один проект EXE, использовать сторонний компоновщик (статический компоновщик google.net для ряда опций) или использовать ILMerge как показанный здесь.

Сторонние линкеры обычно также предлагают обфускацию кода, а некоторые могут также статически связывать .NET Framework.

Ответ 3

Наткнулся на этот вопрос и нашел другой метод достижения этих целей от Джеффри Рихтера (http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx): вы можете встраивать свою .dll в ваш исполняемый файл в качестве ресурса, затем перегрузите событие AssemblyResolve, чтобы загрузить сборку таким образом. Цитирование кода из ссылки:

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);
   }
};

Ответ 4

В отношении ответа Jon Skeet, ILRepack также является хорошим open-source альтернатива ILMerge. Вы можете установить его из NuGet с помощью:

Install-Package ILRepack

Ответ 5

Вы также должны посмотреть ILMERGE-GUI. Это оболочка GUI для ILMerge.