Статическая связь библиотек, созданных на С#.NET.
Я использую VS2008 С#.NET.
Я создал 3 разных класса библиотек в 3 проектах. Я написал приложение, которое использует эти библиотеки (dll).
Что происходит, каждый проект компилируется в библиотеку классов. Итак, у меня 3 dll и 1 exe.
Вместо этого я хочу иметь их двумя способами:
- Только сборка библиотеки классов (dll), которая содержит 3 из них и 1 exe.
- только один EXE (все внутри него):: статическая привязка.
Как я мог это сделать? Я не могу найти какие-либо опции для статической привязки в VS2008, пожалуйста, также укажите параметры командной строки.
Ответы
Ответ 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.