Слить DLL в EXE?
У меня есть два DLL-файла, которые я хотел бы включить в свой EXE-файл, чтобы его было легче распространять. Я кое-где прочитал, как это сделать, даже нашел хорошую ветку здесь и здесь, но это слишком сложно для меня, и мне нужны реальные базовые инструкции о том, как это сделать.
Я использую Microsoft Visual C# Express 2010, и, пожалуйста, извините за мой "низкий стандарт" вопрос, но я чувствую, что я на один или два уровня ниже опыта всех остальных:-/ Если кто-то может указать, как объединить эти файлы DDL в мой EXE в пошаговом руководстве, это было бы действительно здорово!
13 ответов
Для.NET Framework 4.5
ILMerge.exe /target:winexe /targetplatform:"v4,C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" /out:finish.exe insert1.exe insert2.dll
- Откройте CMD и перейдите в ваш каталог. Скажем так:
cd C:\test
- Вставьте вышеуказанный код.
/out:finish.exe
замещатьfinish.exe
с любым именем файла, который вы хотите.- За
/out:finish.exe
Вы должны дать файлы, которые вы хотите объединить.
Используйте Costura.Fody.
Вам просто нужно установить nuget, а затем выполнить сборку. Финальный исполняемый файл будет автономным.
Загрузите ilmerge и ilmergre gui. делает объединение файлов настолько простым, что я использовал их и отлично работает
Ссылайтесь на DLL к своим ресурсам и используйте AssemblyResolve-Event для возврата Resource-DLL.
public partial class App : Application
{
public App()
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
Assembly thisAssembly = Assembly.GetExecutingAssembly();
//Get the Name of the AssemblyFile
var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";
//Load form Embedded Resources - This Function is not called if the Assembly is in the Application Folder
var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
if (resources.Count() > 0)
{
var resourceName = resources.First();
using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
{
if (stream == null) return null;
var block = new byte[stream.Length];
stream.Read(block, 0, block.Length);
return Assembly.Load(block);
}
}
return null;
};
}
}
Установите ILMerge, как другие потоки говорят вам
Затем перейдите в папку установки, по умолчанию
C:\Program Files (x86)\Microsoft\ILMerge
Перетащите ваши Dll's и Exes в эту папку
Удерживая клавишу "Shift", щелкните правой кнопкой мыши в этой папке и выберите "Открыть командную строку".
Написать
ilmerge myExe.exe Dll1.dll /out:merged.exe
Обратите внимание, что вы должны написать свой exe в первую очередь.
Там вы получили свой объединенный exe. Это может быть не лучшим способом, если вы собираетесь делать это несколько раз, но самым простым для одноразового использования, я бы порекомендовал поставить Ilmerge на свой путь.
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
/* PUT THIS LINE IN YOUR CLASS PROGRAM MAIN() */
AppDomain.CurrentDomain.AssemblyResolve += (sender, arg) => { if (arg.Name.StartsWith("YOURDLL")) return Assembly.Load(Properties.Resources.YOURDLL); return null; };
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
Сначала добавьте библиотеки DLL в ваш проект - Ресурсы. Добавить папку "Ресурсы"
Обновление 2019 (только для справки):
Начиная с .NET Core 3.0, эта функция поддерживается из коробки. Чтобы воспользоваться преимуществами публикации однофайлового исполняемого файла, просто добавьте следующую строку в файл конфигурации проекта:
<PropertyGroup>
<PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
Сейчас же, dotnet publish
должен создать один файл.exe без использования каких-либо внешних инструментов.
Дополнительная документация по этой функции доступна на https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md.
Вот официальная документация. Это также автоматически загружается на шаге 2.
Ниже приведен действительно простой способ сделать это, и я успешно построил свое приложение, используя .NET framework 4.6.1
Установите пакет ILMerge nuget с помощью графического интерфейса или командной строки:
Install-Package ilmerge
Убедитесь, что вы загрузили его. Теперь установите (не уверен, что команда для этого, но просто перейдите к пакетам nuget): Примечание: вам, вероятно, нужно установить его только для одного из ваших решений, если у вас есть несколько
Перейдите в папку вашего решения, и в папке пакетов вы увидите "ILMerge" с исполняемым файлом:
\FindMyiPhone-master\FindMyiPhone-master\packages\ILMerge.2.14.1208\tools
Теперь вот исполняемый файл, который вы можете скопировать на свой
\bin\Debug
(или где бы ни создавалось ваше приложение), а затем в командной строке /powershell сделайте что-то вроде ниже:ILMerge.exe myExecutable.exe myDll1.dll myDll2.dll myDlln.dll myNEWExecutable.exe
Теперь у вас будет новый исполняемый файл со всеми вашими библиотеками в одном!
Также вы можете использовать ilmergertool в codeplex с интерфейсом GUI.
ПРИМЕЧАНИЕ. Если вы пытаетесь загрузить сборку, отличную от ILOnly,
Assembly.Load(block)
не сработает, и будет выдано исключение: подробнее
Я преодолел это, создав временный файл и используя
Assembly.LoadFile(dllFile)
Я нашел решение Ниже приведены Stpes:-
- Скачайте ILMerge.msi и установите его на свой компьютер.
- Открыть командную строку
- введите cd C: \ Program Files (x86) \ Microsoft \ ILMerge Preess Enter
- C: \ Program Files (x86) \ Microsoft \ ILMerge> ILMerge.exe / target: winexe /targetplatform:"v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 "/out:NewExeName.exe SourceExeName.exe DllName.dll
Для нескольких Dll: -
C: \ Program Files (x86) \ Microsoft \ ILMerge> ILMerge.exe / target: winexe /targetplatform:"v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 "/out:NewExeName.exe SourceExeName.exe DllName1.dll DllName2.dll DllName3.dll
Я ответил на аналогичный вопрос для VB.NET
, Это не должно быть слишком трудно конвертировать. Вы встраивали DLL's
в ваш Ressource
папку и при первом использовании AppDomain.CurrentDomain.AssemblyResolve
событие начинается.
Если вы хотите ссылаться на него во время разработки, просто добавьте нормальный DLL
ссылка на ваш проект.
Командой должен быть следующий скрипт:
ilmerge myExe.exe Dll1.dll /target:winexe /targetplatform:"v4,c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\" /out:merged.exe /out:merged.exe