Слить 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

ILMerge

  1. Откройте CMD и перейдите в ваш каталог. Скажем так: cd C:\test
  2. Вставьте вышеуказанный код.
  3. /out:finish.exe замещать finish.exe с любым именем файла, который вы хотите.
  4. За /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

Вызов

ilmerge /target:winexe /out:c:\output.exe c:\input.exe C:\input.dll
  1. Установите ILMerge, как другие потоки говорят вам

  2. Затем перейдите в папку установки, по умолчаниюC:\Program Files (x86)\Microsoft\ILMerge

  3. Перетащите ваши Dll's и Exes в эту папку

  4. Удерживая клавишу "Shift", щелкните правой кнопкой мыши в этой папке и выберите "Открыть командную строку".

  5. Написать

    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

  1. Установите пакет ILMerge nuget с помощью графического интерфейса или командной строки:

    Install-Package ilmerge
    
  2. Убедитесь, что вы загрузили его. Теперь установите (не уверен, что команда для этого, но просто перейдите к пакетам nuget): Примечание: вам, вероятно, нужно установить его только для одного из ваших решений, если у вас есть несколько

  3. Перейдите в папку вашего решения, и в папке пакетов вы увидите "ILMerge" с исполняемым файлом:

    \FindMyiPhone-master\FindMyiPhone-master\packages\ILMerge.2.14.1208\tools
    

  4. Теперь вот исполняемый файл, который вы можете скопировать на свой \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:-

  1. Скачайте ILMerge.msi и установите его на свой компьютер.
  2. Открыть командную строку
  3. введите cd C: \ Program Files (x86) \ Microsoft \ ILMerge Preess Enter
  4. 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 ссылка на ваш проект.

Вставить 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
Другие вопросы по тегам