Внедрить dll в exe

200
07 мая 2018, 21:52

Подскажите пожалуйста, как исправить код ниже (c# winforms vs2010). Сейчас выдает ошибку "Не удалось загрузить файл Newtonsoft.Json.dll".

При этом файл exe после компиляции по размеру включает этот dll. Newtonsoft.Json.dll добавлен в проект, копировать локально=false.

Файл dll загружен из https://json.codeplex.com/releases (взят из папки bin/net40). Выбрано: копировать в выходной каталог=не копировать, действие при построении=внедренный ресурс. Использую:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Reflection;
namespace Demo
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
            Application.Run(new Form1());
        }
        static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("EmbedAssembly.Newtonsoft.Json.dll"))
            {
                byte[] assemblyData = new byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }
    }
}
Answer 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Reflection;
using Newtonsoft.Json;
namespace Demo
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
            Application.Run(new Form1());
        }
        private static Assembly OnResolveAssembly(object sender, ResolveEventArgs e)
        {
            var thisAssembly = Assembly.GetExecutingAssembly();
            var assemblyName = new AssemblyName(e.Name);
            var dllName = assemblyName.Name + ".dll";
            var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(dllName));
            if (resources.Any())
            {
                var resourceName = resources.First();
                using (var stream = thisAssembly.GetManifestResourceStream(resourceName))
                {
                    if (stream == null) return null;
                    var block = new byte[stream.Length];
                    try
                    {
                        stream.Read(block, 0, block.Length);
                        return Assembly.Load(block);
                    }
                    catch (Exception)
                    {
                        return null;
                    }
                }
            }
            return null;
        }
    }
}
READ ALSO
PredicateBuilder

PredicateBuilder

Нашёл пример как можно по частям собирать linq запросС помощью класса predicateBuilder

209
Ошибка при запуске консоли под .NET Framework на Debian

Ошибка при запуске консоли под .NET Framework на Debian

Появляется ошибка при запуске ConsoleApp2exe на Debian x86

189
Флаг закрытия SaveFileDialog WPF MVVM ICommand

Флаг закрытия SaveFileDialog WPF MVVM ICommand

Есть проблема при работе с SaveFileDialogПо задумке, при сохранении файла вывожу модальное окно с текстом "Успешно сохранено", в противном случае...

206
Нужны советы по unity 3d [требует правки]

Нужны советы по unity 3d [требует правки]

Недавно заинтересовался разработкой игр, очень понравился движок unity и решил изучать егоДля начала решил ознакомится с c# (по сайту mesharp

174