using System; using System.Collections.Generic; using System.Globalization; using System.Reflection; using System.Resources; using Properties; public static class ResLib { private static readonly HashSet<string> resolvedAssemblies = new HashSet<string>(); /// <summary> /// Метод для подгрузки всех найденных библиотек в ресурсах /// </summary> public static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { if (!resolvedAssemblies.Contains(args.Name)) { resolvedAssemblies.Add(args.Name); string resourceName = string.Empty; var missingAssembly = new AssemblyName(args.Name); if (missingAssembly.Name.Contains("-") || missingAssembly.Name.EndsWith(".dll")) { CultureInfo ci = missingAssembly.CultureInfo; resourceName = $"{missingAssembly.Name.Replace('.', '_')}_{ci.Name.Replace('-', '_')}"; } if (!missingAssembly.Name.Contains("-") || missingAssembly.Name.EndsWith(".dll")) { resourceName = $"{missingAssembly.Name.Replace('.', '_')}"; } ResourceManager rm = Resources.ResourceManager; byte[] asmBytes = (byte[])rm?.GetObject(resourceName); if (asmBytes != null) { return Assembly.Load(asmBytes); } } return null; } } Код using System; using System.Collections.Generic; using System.Globalization; using System.Reflection; using System.Resources; using Properties; public static class ResLib { private static readonly HashSet<string> resolvedAssemblies = new HashSet<string>(); /// <summary> /// Метод для подгрузки всех найденных библиотек в ресурсах /// </summary> public static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { if (!resolvedAssemblies.Contains(args.Name)) { resolvedAssemblies.Add(args.Name); string resourceName = string.Empty; var missingAssembly = new AssemblyName(args.Name); if (missingAssembly.Name.Contains("-") || missingAssembly.Name.EndsWith(".dll")) { CultureInfo ci = missingAssembly.CultureInfo; resourceName = $"{missingAssembly.Name.Replace('.', '_')}_{ci.Name.Replace('-', '_')}"; } if (!missingAssembly.Name.Contains("-") || missingAssembly.Name.EndsWith(".dll")) { resourceName = $"{missingAssembly.Name.Replace('.', '_')}"; } ResourceManager rm = Resources.ResourceManager; byte[] asmBytes = (byte[])rm?.GetObject(resourceName); if (asmBytes != null) { return Assembly.Load(asmBytes); } } return null; } } Вызывается так: AppDomain.CurrentDomain.AssemblyResolve += ResLib.CurrentDomain_AssemblyResolve; Код AppDomain.CurrentDomain.AssemblyResolve += ResLib.CurrentDomain_AssemblyResolve;
Можно в билдер добавить(dnlib) и в автомате подгрузит. Хотя хз. (видел подобную реализацию в одном обфусе через Foreach(строчек 6-7)). --- Сообщение объединено с предыдущим 21 окт 2021 Моя реализация Я думаю так проще. кстати способ как вариант вынести библиотеки за софт(на гитхаб мб), и просто качать byte[] в нужный момент. Либо просто делать динамическую подгрузку и использование методов библиотеки без юсингов тоже через Ассамблею.