Объединить 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 в свой каталог. Скажем:
cd C:\test
- вставьте приведенный выше код.
-
/out:finish.exe
заменитьfinish.exe
С любым именем вы хотите. - за
/out:finish.exe
вы должны дать файлы, которые вы хотите быть комбинированный.
скачать ilmerge и ilmergre gui . делает присоединение к файлам так легко ive использовал их и отлично работает
ссылайтесь на библиотеки DLL на свои ресурсы и используйте AssemblyResolve-Event для возврата 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;
};
}
}
использовать Costura.Фоди!--2-->.
вы просто установить NuGet для а затем сделайте сборку. Окончательный исполняемый файл будет автономной.
Установить ILMerge как другие потоки говорят вам
затем заходим в папку установки, по умолчанию
C:\Program Files (x86)\Microsoft\ILMerge
перетащите Dll и Exes в эту папку
Shift-Rightclick в этой папке и выберите Открыть командную строку
-
написать
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 в ресурсы проекта. Добавить папку "Resources"
также вы можете использовать ilmergertool в codeplex с интерфейсом GUI.
я ответил на аналогичный вопрос для VB.NET
. Однако это не должно быть слишком трудно преобразовать. Вы вставляете DLL's
в своем Ressource
папка и при первом использовании,
AppDomain.CurrentDomain.AssemblyResolve
событие увольняют.
если вы хотите ссылаться на него во время разработки, просто добавить нормальной DLL
ссылка на ваш проект.
здесь официальная документация. Это также автоматически загружается на Шаге 2.
Ниже приведен очень простой способ сделать это, и я успешно построил свое приложение с помощью .NET framework 4.6.1
-
установите пакет ILMerge nuget через gui или командную строку:
Install-Package ilmerge
убедитесь, что вы скачали его. Теперь Установите (не уверен, что команда для этого, но просто перейдите к пакетам nuget):
Примечание: Вы, вероятно, нужно только установить для одного из ваших решений, если у вас несколько
-
перейдите к папке решения и в папке packages вы должны увидеть ILMerge с исполняемым:
\FindMyiPhone-master\FindMyiPhone-master\packages\ILMerge.2.14.1208\tools
-
теперь вот исполняемый файл, который вы можете скопировать в свой
\bin\Debug
(или где бы ни было построено ваше приложение), а затем в командной строке / powershell do что-то вроде ниже:ILMerge.exe myExecutable.exe myDll1.dll myDll2.dll myDlln.dll myNEWExecutable.exe
теперь у вас будет новый исполняемый файл со всеми вашими библиотеками в одном!
Примечание: Если вы пытаетесь загрузить сборку non-ILOnly, то
Assembly.Load(block)
не будет работать, и будет выдано исключение: более подробная информация
Я преодолел это, создав временный файл, и с помощью
Assembly.LoadFile(dllFile)
Я нашел решение ниже Stpes:-
- Скачать ILMerge.msi и установите его на свой компьютер.
- Открыть Командную Строку
- тип cd C:\Program файлы (x86)\Microsoft\ILMerge Preess Enter
- C:\Program файлы (x86)\Microsoft\ILMerge>ILMerge.exe / цель: winexe / targetplatform: "v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319" / out: NewExeName.exe SourceExeName.исполняемый параметр dllname.dll файлы
Для Нескольких Dll: -
C:\Program файлы (x86)\Microsoft\ILMerge>ILMerge.exe / цель: winexe / targetplatform: "v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319" / out: NewExeName.exe SourceExeName.exe DllName1.dll файлы DllName2.DllName3 библиотеки DLL.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