Загрузка...

Загрузка dll из ресурсов - ILMerge

Тема в разделе C# создана пользователем r3xq1 4 фев 2021. 381 просмотр

  1. r3xq1
    r3xq1 Автор темы 4 фев 2021 https://t.me/DarkSoft_Extra 119 27 июл 2018
    Чтобы использовать приложения без библиотек ( которые лежат рядом с вашим приложением ) сделаем следующее:

    * В проекте ( студии ) создаём папку, даём название любое ( пример: Library )
    * Компилируем приложение, из папки \bin\Release - все библиотеки закидываем в папку Library ( перетаскиваем в студии )
    * В самой студии: Проект - Свойства - Ресурсы - Добавить ресурс - Добавить сущ.. файл:
    * Выбираем все файлы из папки Library.
    * Компилируем!

    Код для работы приложения без библиотек:
    Код
    namespace NetLibTools
    {
    using System;
    using System.Collections.Generic;
    using System.Reflection;
    using System.Resources;
    using Properties;

    public static class ResLib
    {
    private static readonly HashSet<string> resolvedAssemblies = new HashSet<string>();
    public static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
    if (!resolvedAssemblies.Contains(args.Name))
    {
    Console.WriteLine($"AssemblyResolve: {args?.Name}");
    resolvedAssemblies.Add(args.Name);
    string assemblyName = new AssemblyName(args?.Name)?.Name;
    ResourceManager rm = Resources.ResourceManager;
    byte[] asmBytes = (byte[])rm?.GetObject(assemblyName);
    Console.WriteLine($"Resource {assemblyName}, found: {asmBytes != null}");
    if (asmBytes != null) { return Assembly.Load(asmBytes); }
    }
    return null;
    }
    }
    }
    Ещё можно так ( :
    Код
    public static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
    if (!resolvedAssemblies.Contains(args.Name))
    {
    Console.WriteLine($"AssemblyResolve: {args?.Name}");
    resolvedAssemblies.Add(args.Name);

    string resourceName = string.Empty;
    var missingAssembly = new AssemblyName(args.Name);
    if (missingAssembly.Name.Contains("-") || missingAssembly.Name.EndsWith(".dll"))
    {
    Console.WriteLine($"Resource name: {resourceName} | {missingAssembly.Name}");
    CultureInfo ci = missingAssembly.CultureInfo;
    resourceName = $"{missingAssembly.Name.Replace('.', '_')}_{ci.Name.Replace('-', '_')}";
    }
    if (!missingAssembly.Name.Contains("-") || missingAssembly.Name.EndsWith(".dll"))
    {
    Console.WriteLine($"Resource name: {resourceName} | {missingAssembly.Name}");
    resourceName = $"{missingAssembly.Name.Replace('.', '_')}";
    }

    ResourceManager rm = Resources.ResourceManager;
    byte[] asmBytes = (byte[])rm?.GetObject(resourceName);
    Console.WriteLine($"Resource {resourceName}, found: {asmBytes != null}");
    if (asmBytes != null) { return Assembly.Load(asmBytes); }
    }
    return null;
    }
    Использовать так:
    Код
    namespace NetLibTools
    {
    using System;

    internal static class Program
    {
    [STAThread]
    public static void Main()
    {
    // Подгружаем библиотеки..
    AppDomain.CurrentDomain.AssemblyResolve += ResLib.CurrentDomain_AssemblyResolve;
    Console.Title = "NetLibTools by r3xq1";
    // Тут я для примера взял библиотеку dnlib.dll и кинул её в ресы.
    ModuleEditor.Inizialize("1", "2");
    Console.Read();
    // Для выгрузки библиотек.
    AppDomain.CurrentDomain.AssemblyResolve -= ResLib.CurrentDomain_AssemblyResolve;
    }
    }
    }
    Компилируем всё!
    Удаляем все библиотеки ( рядом с приложением) они уже не нужны и проверяем
    ( размер конечного файла увеличится в разы, в зависимости от размера библиотек! )
     
    4 фев 2021 Изменено
  2. temnij52
    temnij52 6 фев 2021 C# OneLove 46 14 апр 2020
    1. Посмотреть предыдущие комментарии (3)
    2. r3xq1 Автор темы
      temnij52, 15-20 строчек кода это много?)
    3. temnij52
      r3xq1, Он, как минимум, есть)
Загрузка...
Top